php - 带 PHP 整数溢出的哈希函数

标签 php hash integer overflow

我在这里浏览了很多关于“PHP 整数溢出”的问题,但我找不到任何可以回答我的具体问题的内容,所以我希望我没有错过现有的答案。

我想使用 djb2 hash PHP 中的函数将键哈希为类似于分片标识符(SimpleDB 的域索引)的内容。它会溢出无符号长整型,因此我无法在直接 PHP 中以相同的方式执行此操作,因为 PHP 的 native 整型是 32 位有符号的。

所以我尝试了 PHP 的 bclibgmp数学扩展,允许任意长度,并且它们解决了符号/比例问题,但它们使整数“太大” - 即它们不会溢出。

使用 GMP 特别有效,并且似乎给出了一致的结果,但显然比 C 慢一个数量级(0m0.017s 与 0m0.002s)。我不知道这是否只是因为它是 PHP 与 C 的比较,或者如果我能让它溢出,PHP 是否会明显更快。我宁愿测试并找出答案,但我找不到实现这一点的方法。

那么,有什么方法可以强制 PHP 中的 ULONG 最大值吗?我是否需要将 C 函数包装在 PHP 扩展中?或者,考虑到我只计划散列较短的 key (可能是 64 个字符或更少),这会带来严重的 yield 递减吗?

最佳答案

您认为为什么这些哈希函数需要超过 32 位? long 类型不保证是该大小,它们只是 >= 32 位。在我的 32 位平台上,long 始终为 32 位。

我认为,您链接到的那些注释是在 64 位不像现在那么流行的时候编写的,也是在 long long 类型之前编写的(即使在 32 位上也是 >= 64 位) -bit 平台)被引入,所以作者只使用了当时可用的最大类型。

“djb2”哈希只是哈希函数的另一种变体,几乎类似于线性同余生成器,并且它已经为人所知很长时间了。显式模运算被替换为溢出,这实际上是“modulo 2^(sizeof long)”。如果编译为 C,这可能(尽管不确定)对性能有好处,但对哈希质量可能不太好。这在 PHP 中没有意义,因为数字将提升为 double 并增长到无穷大。

我建议使用通常的 PHP 整数的哈希算法,但通过添加显式模数与除数来改进哈希,除数是小于 PHP_INT_MAX 的质数(您是否检查过 64- 的限制)顺便问一下,PHP 的位构建?)。也许,必须更改乘数 (33),以获得更好的散列分布与必须散列的字符串。

关于php - 带 PHP 整数溢出的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4618838/

相关文章:

phpStorm - 配置 xDebug

hash - 如何对使用rust 的单元结构执行 `Hash`?

稀疏矩阵的 Ruby 哈希

algorithm - Hashmap hashcode到内表索引的转换

python - 计算年龄的程序给出关于 getset_descriptor 的错误?

ruby - 如何检查两个数字是否在彼此的阈值内?

javascript - 无法与使用 jquery 的 jquery 加载按钮进行交互

php - 在wordpress中查找并打印mysql的主机名

PHP 正则表达式 preg_match_all : Capturing text between multiple square brackets

c - intXX_t 和 int_fastXX_t 有什么区别?