如何从PHP中的字符串中获取64位整数哈希?

时间:2011-06-10 23:19:11

标签: php algorithm hash 64-bit integer

我需要64位整数的字符串哈希,就像哈希映射一样。

在我看来,没有可以返回64位整数的本机PHP哈希函数?

我认为可以采用sha1哈希的第一部分并将其转换为整数。然而,这不会带来最佳性能,转换似乎很棘手。

当然,没有安装就可以使用本机PHP函数。

6 个答案:

答案 0 :(得分:4)

我尝试了很多,特别是将完整的64位十六进制字符串转换为带符号的64位整数。现在我最终得到了这个:

function sha1_64bitInt($str) {
    $u = unpack('N2', sha1($str, true));
    return ($u[1] << 32) | $u[2];
}

表演处于中间位置。比实现完整哈希算法(如SimpleHash或dbj2)要好得多,比对sha1()crc32的裸调用要慢很多。

当有一个更好的解决方案转换为64位整数时,可以在不破坏向后兼容性的情况下改进此功能(我希望)。

答案 1 :(得分:3)

有关md5哈希的信息,请参阅此页:

http://us.php.net/manual/en/function.md5.php

这将输出一个32字符的十六进制字符串。每个十六进制字符代表4位数据。这意味着您需要16个十六进制字符(或md5哈希的一半)来生成64位。

然后您可以使用hexdec将64位(16x4 = 64)从十六进制转换为int。请注意,如果超过64位,函数将溢出到float类型以尝试表示更大的数字

http://php.net/hexdec

所以基本上

$stringToHash= "abcdefghijk...";
$hash = md5($stringToHash);
$substring = substr($hash, 0,16);
$finalInt = hexdec($substring);

这对你有用。 (但我没有测试过它。)

答案 2 :(得分:0)

如果没有其他人有更好的想法,您可以修改murmurhash_php以轻松调用64位版本的MurmurHash3

答案 3 :(得分:0)

我认为PHP不支持64位整数。你可以使用一个BigInteger类(不是本机PHP)(如果谷歌真的很好找到)。但它只是在内部使用字符串,而且它是复杂的。

答案 4 :(得分:0)

有关CRC64实现的信息,请参见http://php.net/manual/ru/function.crc32.php#111699

答案 5 :(得分:0)

我写了这个函数。它使用不同的 crc32 和 crc32b 来计算两个 32 位哈希,然后将它们组合以获得 64 位哈希。最后将其转换为 64 位整数保存在 MySQL 数据库中的 unsigned BIGINT 字段中。

function hash64int($string)
{
    return $string ? hexdec(hash('crc32', $string) . hash('crc32b', $string)) : null;
}

在某些情况下,32 位哈希可能就足够了。因此您可以使用此函数并将其保存在未签名的 INT 字段中:

function hash32int($string)
{
    return $string ? hexdec(hash('crc32', $string)) : null;
}

我用的是 crc32,因为它比其他的要牢固。