因为工作原因,用到了Times33的算法生成唯一哈希并计算取模。结果发现两个环境运算结果竟然不一样,经过检查定位,发现一个由于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;

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

Related Posts: PHP Times33算法 暗坑 :