PHP哈希函数返回32位整数(int)

12

目标是将哈希值存储在mysql数据库上,使用INT(不是BIGINT或MEDIUMINT)。 md5('string', true) 返回二进制数据,16字节的哈希值。我想可以提取前4个字节并转换为INT(32位/4字节)整数,但我不知道如何做到这一点。

您有什么建议吗?谢谢。


2
$int = bindec(substr(md5('string', true),0,4)) 或者 $int = hexdec(substr(md5('string'),0,8)) - 不过,显然这并没有存储整个哈希值,只是其中的前4个字节。 - DaveRandom
我可以问一下,"hash" 的目的是什么? - Your Common Sense
@DaveRandom: bindec不起作用(hexdec可以)。 - hakre
@hakre 确实不起作用 - 为什么呢? - DaveRandom
我会根据需要调整我的MySQL字段为有符号/无符号...谢谢Dave,我会这样做。 - cedivad
显示剩余3条评论
5个回答

29

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

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

输出

int(222957957)
int(1292159901)

PHP: crc32 - 手册

crc32函数会计算字符串str的32位循环冗余校验多项式(cyclic redundancy checksum polynomial),通常用于验证正在传输的数据的完整性。

因为PHP的整数类型是有符号的,所以许多crc32校验结果都会产生负整数,你需要使用sprintf()或printf()的"%u"格式化程序来获取无符号crc32校验和的字符串表示形式。


7

PHP的hash()函数比crc32()函数更好:

hash("crc32b", $str);

如果需要一个整数:

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

与普通的 crc32()相比,它不会受到 32 位和 64 位系统之间的有符号/无符号整数不一致性的影响(有关详细信息,请参见 PHP 文档: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 的解决方案更好。

2

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

1
另一种选择是使用映射将哈希链接到整数,例如Redis。
L43F34FLK34FL3K4 ==> 1
LKZLCKCLK32 ==> 2
等等....

你的意思是像一个数据库表,我们在其中存储哈希值和自增长的值吗?或者你有一个解决方案,可以动态计算整数值吗? - Philipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接