0

对字符串使用哈希函数 MD5 会创建一个非常长的值,并且每次都会为同一个字符串创建相同的值。现在,我的问题是:有没有办法做类似的事情,比如给它一个字符串,它每次都返回相同的整数,而且它为不同的字符串返回的整数在特定的间隔内。我的意思是这样的。

例如:给它“玛丽有一只小羊羔”。它返回值 10。给出相同的字符串,它再次返回 10。

请一定要问,以防我不完全清楚。

4

2 回答 2

1

您正在描述“哈希函数”。在维基百科上查找。

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;
}
于 2012-01-22T18:07:06.583 回答
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
于 2012-01-23T08:49:23.083 回答