PHP散列函数返回一个整数(32位int)

时间:2011-12-15 13:38:51

标签: php mysql hash integer

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

你有什么建议?感谢。

5 个答案:

答案 0 :(得分:14)

使用crc32,它将返回32位int


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

输出

int(222957957)
int(1292159901)

PHP: crc32 - Manual

  

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

     

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

答案 1 :(得分:2)

ord($hash[0]) * 16777216 + ord($hash[1]) * 65536 + ord($hash[2]) * 256 + ord($hash[3]) ;

或者:

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

但FilipRoséen的解决方案更好。

答案 2 :(得分:1)

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

hash("crc32b", $str);

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

答案 3 :(得分:0)

另一种方法是使用map将哈希链接到整数,例如Redis。

L43F34FLK34FL3K4 ==&gt; 1

LKZLCKCLK32 ==&gt; 2

等......

答案 4 :(得分:0)

这是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;
}