我需要使用这个哈希算法,但我的问题是什么 我可以把它保持不变吗? 我需要它的长度为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;
};
答案 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));