如何限制哈希长度

时间:2015-11-09 08:44:22

标签: javascript hash

我需要使用这个哈希算法,但我的问题是什么 我可以把它保持不变吗? 我需要它的长度为6或7个字符,有时它更大,有时更小......

https://jsfiddle.net/14fmwvyn/

String.prototype.hashCode = function () {
    var hash = 0,
        i, chr, len;
    if (this.length == 0) return hash;
    for (i = 0, len = this.length; i < len; i++) {
        chr = this.charCodeAt(i);
        hash = ((hash << 5) - hash) + chr;
        hash |= 0; // Convert to 32bit integer
    }
    return hash;
};

1 个答案:

答案 0 :(得分:1)

我一般坚持使用已知的散列方法,并且最好使用一种可以自行强制执行常量长度的算法,但哈希仍然是散列,只要它对于相同的值是相同的就可以了,否则它可能只是低效的。

因此,一种始终有效的简单方法是将尾随部分切掉所需长度以上,并填充太短的字符串。关于填充,你可以在这里阅读:

Adding extra zeros in front of a number using jQuery?

缩短你可以使用简单的str.substr调用,请参阅下面的更新小提琴以获得一个例子。您可能需要处理负面处理。另外我不确定你的哈希是否能用超长字符串正常工作,但是一般的机制保持不变。

https://jsfiddle.net/14fmwvyn/4/

var mystring = "t7";      //some text string

function pad (str, max) {  //this will add '0' to 'smaller' numbers
  str = str.toString();
  return str.length < max ? pad("0" + str, max) : str;
}

//your method untouched
String.prototype.hashCode = function() {
  var hash = 0, i, chr, len;
  if (this.length == 0) return hash;
  for (i = 0, len = this.length; i < len; i++) {
    chr   = this.charCodeAt(i);
    hash  = ((hash << 5) - hash) + chr;
    hash |= 0; // Convert to 32bit integer
  }
  return hash;
};

var hash_length =7;     //constant hash length, 
var hashCode = mystring.hashCode(); 
//padded with '0's if too short
var padded = pad(hashCode, hash_length);    
//trimmed if too long
var trimmed = hashCode.toString().substr(0,hash_length);    
//padded and trimmed if too long
var trimmedAndPadded = pad(hashCode.toString().substr(0,hash_length), hash_length));