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? 
 
    