В out
нет места. Алгоритмы C ++ не увеличивают свои целевые контейнеры автоматически. Вы должны либо освободить место самостоятельно, либо использовать адаптер для вставки.
Чтобы освободить место в out
, сделайте это:
out.resize(s.length());
[править] Другой вариант - создать выходную строку с правильным размером с помощью этого конструктора.
std::string out(s.length(), 'X');
Может быть потому, что 33 == 2 ^ 5 + 1
и многие алгоритмы хеширования используют 2 ^ n + 1
в качестве множителя?
Кредит Джерому Бергеру
Обновление:
Похоже, это подтверждается текущей версией программного пакета djb2, изначально полученного из: cdb
Примечания, которые я привел, чтобы описать суть алгоритма хеширования, использующего h = ((h <<
5381, Дэн Бернштейн (djb2) говорит в этой статье :
[...] работает практически любой хороший множитель. Я думаю ты волнуешься о том, что 31c + d не покрывает разумный диапазон хеширования значения, если c и d находятся в диапазоне от 0 до 255. Вот почему, когда я обнаружил хэш-функцию 33 и начал использовать ее в своих компрессорах, я начал с хеш-значением 5381. Я думаю, вы обнаружите, что это так же а также множитель 261.
Вся цепочка здесь , если вам интересно.
У Озана Йигита есть страница с хэш-функциями , на которой написано:
[...] магия числа 33 (почему оно работает лучше, чем многие другие константы, простые или нет) никогда не была адекватно объяснена.