A popular answer for generating a hashing function in JS is given in Simple (non-secure) hash function for JavaScript? and Generate a Hash from string in Javascript
One example of the code is:
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;
}
One line that doesn't make sense to me is hash = ((hash<<5)-hash)+char;
Could someone please explain WHY this is done? I gather that we are doing a 5 bit left shift
on the hash. Is there any reason why it is 5 bits and not 4 or 6? Also why do we then minus the hash and add the char?