与哈希值类似但返回int的东西

时间:2012-01-22 17:54:46

标签: firefox hash firefox-addon dht

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

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

请问,如果我不完全清楚的话。

2 个答案:

答案 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