目标是使用INT(不是BIGINT或MEDIUMINT)将哈希值存储在mysql数据库中。
md5('string', true)
返回二进制数据,16字节的哈希值。我以为我可以grep前4个字节并将其转换为INT(32bit / 4bytes)整数,但我不知道该怎么做。
你有什么建议?感谢。
答案 0 :(得分:14)
使用crc32
,它将返回32位int
。
var_dump (crc32 ("hello world"));
var_dump (crc32 ("world hello"));
输出
int(222957957)
int(1292159901)
生成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;
}