进行des加密操作,发现在windows和linux里得到的结果不一样,发现是createkey过程中有这个运算,从这里开始不一样的。
网络查询得知是int溢出导致,windows下是正确的。建议通过gmp扩展来操作,但是并未找到具体用法,求指教
win的结果:-176881664
lin的结果:-759700962142060544
@eechen
进行des加密操作,发现在windows和linux里得到的结果不一样,发现是createkey过程中有这个运算,从这里开始不一样的。
网络查询得知是int溢出导致,windows下是正确的。建议通过gmp扩展来操作,但是并未找到具体用法,求指教
win的结果:-176881664
lin的结果:-759700962142060544
@eechen
恭喜你掉到php的一个大坑了。
如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
就是这个问题导致了各种匪夷所思的问题。
PHP 不支持无符号整数。
引用php原文
然而,你出现此问题是因为你两个系统的long型(php的int型在内核中均为long型)长度不一致(因为系统位数不一样)。
所以,你如要想解决此问题,就必须手动处理int到uint。
<code class="php">$flag=$int&0x80000000; //取出符号位,判断是否是负数,溢出int范围,但没溢出uint范围时,符号位为1,即为负数 if($flag){ $int ^= 0xffffffff; $int += 1; } </code>
BTW,最新的php7修正了此问题,但php中无法移位一个负数。
不知道这段代码是从何而来的,左右移负数的代码是由CPU完成运算的,所以这里完全依赖机器,与系统关系都不大,看看能不能修正这段代码,或者只能是使用其他方法来代替左右移负数了。
所以从 php7 开始,位移一个负数会直接报错...