DJB2 - это простая некриптографическая хэш-функция, созданная Дэниелом Дж. Бернштейн (собственно отсюда и название функции - инициалы автора). Он используется для различных целей, таких как индексация, поиск и сравнение данных.
В частности я использую ее, если мне нужно сравнить строки между собой и понять, поменялось что-то или нет, например если мне нужно периодически опрашивать какой-то ресурс и уведомлять пользователей, что контент обновился. Это удобно, потому что результат работы этой хеш функции - просто число, его очень удобно хранить и оно не занимает много места.
По сути выходное значение хеша является уникальным идентификатором строки в таком случае
На js код функции выглядит так:
function djb2Hash(str) {
let hash = 5381;
for (let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
hash = ((hash << 5) + hash) + charCode;
}
return hash;
}
const strHash = djb2('example string');
console.log(strHash);
В качестве начального значения хеша выбрано простое число 5381
, число выбрано самим Бернштейном. Простые числа часто используются в хеш-функциях, потому что они, как правило, дают более равномерное распределение хэш-значений.
Еще из интересного ((hash << 5) + hash)
- эквивалетно умножению hash
на 33
. Но почему именно 33?
Автор функции, экспериментировал с различными значениями множителя и обнаружил, что 33 дали хорошие результаты с точки зрения минимизации коллизий и создания равномерного распределения хэш-значений. В частности, он обнаружил, что 33 хорошо работают в сочетании с побитовым левым сдвигом (<< 5), который используется в алгоритме DJB2, то есть число по сути подобрано эмперически.
Подводя итоги
Вы можете использовать хеш-функцию DJB2 для создания хеш-значений для различных целей, таких как реализация хэш-таблиц или механизмы кэширования. Однако имейте в виду, что хеш-функция DJB2 не является криптографически безопасной и не должна использоваться для хеширования конфиденциальных данных или в целях, связанных с безопасностью.