Почему 5381 и 33 так важны в djb2 алгоритме?

В out нет места. Алгоритмы C ++ не увеличивают свои целевые контейнеры автоматически. Вы должны либо освободить место самостоятельно, либо использовать адаптер для вставки.

Чтобы освободить место в out, сделайте это:

out.resize(s.length());

[править] Другой вариант - создать выходную строку с правильным размером с помощью этого конструктора.

std::string out(s.length(), 'X');

59
задан Trojan 3 January 2014 в 01:56
поделиться

2 ответа

Может быть потому, что 33 == 2 ^ 5 + 1 и многие алгоритмы хеширования используют 2 ^ n + 1 в качестве множителя?

Кредит Джерому Бергеру

Обновление:

Похоже, это подтверждается текущей версией программного пакета djb2, изначально полученного из: cdb

Примечания, которые я привел, чтобы описать суть алгоритма хеширования, использующего h = ((h <<

9
ответ дан 24 November 2019 в 18:28
поделиться

5381, Дэн Бернштейн (djb2) говорит в этой статье :

[...] работает практически любой хороший множитель. Я думаю ты волнуешься о том, что 31c + d не покрывает разумный диапазон хеширования значения, если c и d находятся в диапазоне от 0 до 255. Вот почему, когда я обнаружил хэш-функцию 33 и начал использовать ее в своих компрессорах, я начал с хеш-значением 5381. Я думаю, вы обнаружите, что это так же а также множитель 261.

Вся цепочка здесь , если вам интересно.

У Озана Йигита есть страница с хэш-функциями , на которой написано:

[...] магия числа 33 (почему оно работает лучше, чем многие другие константы, простые или нет) никогда не была адекватно объяснена.
20
ответ дан 24 November 2019 в 18:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: