【问题标题】:How can I get the correct modulo value from an signed int in php?如何从 php 中的已签名 int 中获取正确的模值?
【发布时间】:2017-09-22 14:40:29
【问题描述】:

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

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

【问题讨论】:

  • 问题是潜在的负数?您可以简单地在生成的 crc32() 号码上调用 abs(),然后接收提醒。
  • @AlexHG abs 的问题在于,这将在 32 位和 64 位系统上给出不同的返回值,因为例如,-1372627184157704578crc32("Hello") 的结果相同,但是是具有不同模数的不同数字。

标签: php 32bit-64bit checksum crc32


【解决方案1】:

如果结果为负,则加 22。(22 是 232 mod 26。)如果仍然为负,则加 26。无论整数大小如何,这都有效。如果整数大小为 64,则结果永远不会是负数。

【讨论】:

    【解决方案2】:

    一种可能的解决方案是生成一个十六进制值,将十六进制值转换为十进制浮点数并使用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);
        }
    }
    

    这很丑陋,但似乎有效。希望有更好的办法...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多