如何从php中的signed int获取正确的模数值?

时间:2017-09-22 14:40:30

标签: php 32bit-64bit checksum crc32

当我在32位PHP系统(crc32为4)上进行PHP_INT_SIZE调用时,得到的整数值可以是负数。无论我是在32位还是64位系统上,如何从数字中获取正确的模数值?

function checksumChar($str) {
    if(PHP_INT_SIZE > 4) {
        return crc32($str) % 26;
    } else {
        // ???
    }
}

2 个答案:

答案 0 :(得分:1)

如果结果为负,则添加22.(22为2 32 mod 26.)如果它仍然为负,则添加26.无论整数大小如何,这都将起作用。如果整数大小为64,则结果永远不会为负。

答案 1 :(得分:0)

一种可能的解决方案是生成十六进制值,将十六进制值转换为十进制浮点数并使用fmod

function checksumChar($str) {
    if(PHP_INT_SIZE > 4) {
        return crc32($str) % 26;
    } else {
        $hexCRC = (hash('crc32', $str);
        $floatCRC = (float) base_convert($hexCRC, 16, 10);
        return (int) fmod($floatCRC, 26);
    }
}

它很难看,但似乎有效。我希望有更好的方法......