djb2 hash function

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 не является криптографически безопасной и не должна использоваться для хеширования конфиденциальных данных или в целях, связанных с безопасностью.