Популярный ответ на создание хэш-функции в JS приведен в Simple (небезопасный ) хэш-функция для JavaScript? и Создать хэш из строки в Javascript
Один из примеров кода:
String.prototype.hashCode = function() {
var hash = 0;
if (this.length == 0) {
return hash;
}
for (var i = 0; i < this.length; i++) {
var char = this.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
Одна строка, которая не имеет для меня смысла, это hash = ((hash<<5)-hash)+char;
Может кто-нибудь объяснить, ПОЧЕМУ это делается? Насколько я понимаю, мы делаем 5 bit left shift
с хэшем. Есть ли причина, почему это 5 бит, а не 4 или 6? Кроме того, почему мы тогда минус хеш и добавить char?