在字符串上使用散列函数MD5会创建一个非常长的值,并且每次为同一个字符串创建相同的值。现在,我的问题是:有没有办法做类似的事情,比如给它一个字符串,每次返回相同的整数,并且它返回的不同字符串的整数都在特定的间隔内。我的意思是this之类的东西。
前:给它“玛丽有一只小羊羔。”它返回值10.给出相同的字符串,它再次返回10.
请问,如果我不完全清楚的话。
答案 0 :(得分:1)
您正在描述“哈希函数”。在维基百科上查找。
MD5是一种哈希函数。大多数MD5实现返回一个字符串,但该字符串只是(LARGE)整数的表示。您可以使用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;
}
答案 1 :(得分:1)
您可以使用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