Я изучаю с книгой, что о структуре данных.
Я читаю главу хеш-таблицы, в разделе сворачивания цифр, он показывает алгоритм хеширования.
int Hash(char* key, int keyLength, int tableSize)
{
int i = 0;
int hashValue= 0;
for(i=0; i<keyLenth; i++)
hashValue += key[i];
return hashValue % tableSize;
}
Замените каждый элемент строки кодом ASCII (0-127) и добавьте эти значения отдельно.
введите описание изображения здесь
Но есть одна проблема.Если размер хеш-таблицы равен 12289, а максимальная длина строки составляет 10 цифр, хеш-функция возвращает 10X127 = 1270, она возвращает только адрес в диапазоне от 0 до 1270, поэтому адрес в диапазоне от 1271 до 12288 вообще не используется,
Размер хеш-таблицы 12289 составляет 11000000000001 в двоичном формате.Это всего 14 бит.С другой стороны, максимальное значение адреса 1270 составляет 10011110110, поэтому используются только 11 битов.Этот факт показывает, что три бита никогда не используются.Таким образом, каждый раз, когда цикл функции Hash повторяется, мы перемещаем hashValue на 3 бита влево и добавляем следующий код ASCII.Это теоретически сможет хэшировать все адреса.
Мой вопрос: зачем мне сдвигать 3 бита влево?Есть ли причина, по которой я не должен сдвигать его вправо?