繁体   English   中英

如何从 PHP 中的字符串中获取 64 位 integer hash?

[英]How to get a 64 bit integer hash from a string in PHP?

我需要 64 位 integer 字符串散列,例如 hash map。

在我看来,好像没有可以返回 64 位整数的本机 PHP hash 功能?

我认为可以将 sha1 hash 的第一部分转换为 integer。 但是,这不会带来最佳性能,而且转换似乎很棘手。

当然,不用安装就可以使用本机 PHP 功能。

我尝试了很多,尤其是将完整的 64 位十六进制字符串转换为有符号的 64 位 integer。 现在我结束了:

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

性能介于中间。 比实现完整的 hash 算法(如 SimpleHash 或 dbj2)要好得多,并且比对sha1()crc32的裸调用慢得多。

如果有更好的解决方案可以转换为 64 位 integer,则可以在不破坏向后兼容性的情况下改进此 function(我希望)。

有关 md5 hash 的信息,请参阅此页面:

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

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

然后,您可以使用 hexdec 将 64 位 (16x4=64) 从 hex 转换为 int。 请注意,如果您传递超过 64 位,则 function 将溢出到浮点类型以尝试表示更大的数字

http://php.net/hexdec

所以基本上

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

那应该对你有用。 (但我没有测试过)。

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

如果没有其他人有更好的主意,您可能可以修改murmurhash_php以非常轻松地调用 64 位版本的MurmurHash3

我认为 PHP 不支持 64 位整数。 有一个 BigInteger class (不是原生 PHP),你可以使用(如果你用谷歌搜索的话)。 但它只是在内部使用字符串,而且非常复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM