因为工作原因,用到了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;
将值进行转换,这样就可以保证全平台全版本执行结果的一致性了。
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。