请知悉:本文最近一次更新为 3年 前,文中内容可能已经过时。

因为工作原因,用到了Times33的算法生成唯一哈希并计算取模。结果发现两个环境运算结果竟然不一样,经过检查定位,发现一个由于PHP版本导致的暗坑。

这个暗坑可能后人不会遇到,因为其出现方式比较独特,就是不同的PHP版本下,最终运算结果不同~~~举个例子:

<?php
echo number_format(floatval((float)(-8006205905487852544)+(float)(-6014801457580730270)+52), 0, '', '')."\r\n";

上面这句指令,在PHP5.2的环境和PHP5.5的环境输出的结果是不一样滴。
可能已经注意到了,这些大数叠加后,导致了越界情况的发生,而实际来看,PHP5.2和PHP5.5对实数的越界范围应该是有所不同的,所以就导致了二者执行的结果不同。

解决办法也很简单,就是在这些大数进行运算前,将其转换为实数。我用的方式是在计算前,使用:

$hash = $hash & 0x7FFFFFFF;

将值进行转换,这样就可以保证全平台全版本执行结果的一致性了。


如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。

尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。


与《PHP Times33算法 暗坑》相关的博文:


留言

avatar
😀
😀😁😂😅😭🤭😋😘🤔😰😱🤪💪👍👎🤝🌹👌