对字符串使用哈希函数 MD5 会创建一个非常长的值,并且每次都会为同一个字符串创建相同的值。现在,我的问题是:有没有办法做类似的事情,比如给它一个字符串,它每次都返回相同的整数,而且它为不同的字符串返回的整数在特定的间隔内。我的意思是这样的。
例如:给它“玛丽有一只小羊羔”。它返回值 10。给出相同的字符串,它再次返回 10。
请一定要问,以防我不完全清楚。
对字符串使用哈希函数 MD5 会创建一个非常长的值,并且每次都会为同一个字符串创建相同的值。现在,我的问题是:有没有办法做类似的事情,比如给它一个字符串,它每次都返回相同的整数,而且它为不同的字符串返回的整数在特定的间隔内。我的意思是这样的。
例如:给它“玛丽有一只小羊羔”。它返回值 10。给出相同的字符串,它再次返回 10。
请一定要问,以防我不完全清楚。
您正在描述“哈希函数”。在维基百科上查找。
MD5 是一种散列函数。大多数 MD5 实现返回一个字符串,但该字符串只是一个(大)整数的表示。您可以获取 MD5 哈希,然后根据需要使用尽可能多的低位来获得所需大小的整数。如果所需范围不是 2 的幂,则需要进行模运算以使其进入所需范围。
此外,几乎每一种现代编程语言都有一个用于散列字符串的内置函数,它返回一个整数。在 Java 中,它是 String.hashCode()。在 Ruby 中,它是 String#hash。
在这种情况下,语言是 Javascript,它(我很震惊地学习)似乎没有内置这样的东西。这是来自 Java 平台的 String.hashCode() (也许你可以将它移植到 Javascript):
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
您可以使用 MD5 哈希的低字节。您必须考虑 JavaScript(至少在 Firefox 9 中)可以使用 48 位(6 字节)来存储精确的整数,另一方面,MD5 哈希的长度是 128 位(16 字节)。因此,与通常使用 MD5 相比,您必然会遇到更多的哈希冲突。但仍然:
function toHashCode(str)
{
// Convert string to an array of bytes
var array = Array.prototype.slice.call(str);
// Create MD5 hash
var hashEngine = Components.classes["@mozilla.org/security/hash;1"]
.createInstance(Components.interfaces.nsICryptoHash);
hashEngine.init(hashEngine.MD5);
hashEngine.update(array, array.length);
var hash = hashEngine.finish(false);
// Turn the first 6 bytes of the hash into a number
var result = 0;
for (var i = 0; i < 6; i++)
result = result * 256 + hash.charCodeAt(i);
return result;
}
alert(toHashCode("test")); // Displays 265892827251497
alert(toHashCode("Mary had a little lamb.")); // Displays 117938552300214