【问题标题】:PHP hashing function that returns an integer (32bit int)返回整数(32 位整数)的 PHP 哈希函数
【发布时间】:2014-06-27 04:17:03
【问题描述】:

目标是使用 INT(不是 BIGINT 或 MEDIUMINT)将哈希存储在 mysql 数据库中。 md5('string', true) 返回二进制数据,16 字节散列。我以为我可以 grep 前 4 个字节并将其转换为 INT(32bit/4bytes) 整数,但我不知道该怎么做。

你有什么建议?谢谢。

【问题讨论】:

  • $int = bindec(substr(md5('string', true),0,4))$int = hexdec(substr(md5('string'),0,8)) - 但是,很明显,这不会存储整个哈希值,只存储它的前 4 个字节。
  • 请问,这样的“哈希”目的是什么?
  • @DaveRandom:bindec 不起作用(hexdec 起作用)。
  • @hakre 确实不起作用 - 为什么会这样?
  • @cedivad:你的 MySQL 中的 INT 是有符号的还是无符号的?

标签: php mysql hash integer


【解决方案1】:

使用crc32,它会返回一个32位的int


var_dump (crc32 ("hello world"));
var_dump (crc32 ("world hello"));

输出

int(222957957)
int(1292159901)

PHP: crc32 - Manual

生成 32 位长度的循环冗余校验和多项式 海峡的。这通常用于验证数据的完整性 正在传输。

因为 PHP 的整数类型是有符号的,而且很多 crc32 校验和会 导致负整数,你需要使用“%u”格式化程序 sprintf() 或 printf() 获取无符号的字符串表示 crc32 校验和。

【讨论】:

    【解决方案2】:
    ord($hash[0]) * 16777216 + ord($hash[1]) * 65536 + ord($hash[2]) * 256 + ord($hash[3]) ;
    

    或者:

    unpack("L", substr($hash,0,4));
    

    但 Filip Roséen 的解决方案更好。

    【讨论】:

      【解决方案3】:

      比 crc32 更好的是 php hash() 函数:

      hash("crc32b", $str);
      

      如果需要整数:

      intval(hash("crc32b", $str), 16);
      

      与普通的crc32()相比,它不会受到32位和64位系统之间有符号/无符号整数不一致的影响(详见PHP文档:crc32

      【讨论】:

        【解决方案4】:

        这是 Daniel J. Bernstein 哈希,它返回一个 32 位整数。

        function djb_hash($str) {
          for ($i = 0, $h = 5381, $len = strlen($str); $i < $len; $i++) {
            $h = (($h << 5) + $h + ord($str[$i])) & 0x7FFFFFFF;
          }
          return $h;
        }
        

        【讨论】:

          【解决方案5】:

          另一种选择是使用映射将哈希链接到整数,例如 Redis。

          L43F34FLK34FL3K4 ==> 1

          LKZLCKCLK32 ==> 2

          等等……

          【讨论】:

          • 你的意思是像一个我们存储散列 + 自动增量值的数据库表?或者您是否有一个解决方案,我们可以在其中动态计算整数值?
          猜你喜欢
          • 2014-11-14
          • 1970-01-01
          • 2012-07-22
          • 1970-01-01
          • 2011-06-04
          • 2016-12-22
          • 1970-01-01
          • 2012-09-30
          相关资源
          最近更新 更多