目标是将哈希值存储在mysql数据库上,使用INT(不是BIGINT或MEDIUMINT)。
md5('string', true)
返回二进制数据,16字节的哈希值。我想可以提取前4个字节并转换为INT(32位/4字节)整数,但我不知道如何做到这一点。
您有什么建议吗?谢谢。
使用crc32
,它将返回一个32位的int
。
var_dump (crc32 ("hello world"));
var_dump (crc32 ("world hello"));
输出
int(222957957)
int(1292159901)
crc32函数会计算字符串str的32位循环冗余校验多项式(cyclic redundancy checksum polynomial),通常用于验证正在传输的数据的完整性。
因为PHP的整数类型是有符号的,所以许多crc32校验结果都会产生负整数,你需要使用sprintf()或printf()的"%u"格式化程序来获取无符号crc32校验和的字符串表示形式。
PHP的hash()
函数比crc32()
函数更好:
hash("crc32b", $str);
如果需要一个整数:
intval(hash("crc32b", $str), 16);
与普通的 crc32()
相比,它不会受到 32 位和 64 位系统之间的有符号/无符号整数不一致性的影响(有关详细信息,请参见 PHP 文档:crc32)
ord($hash[0]) * 16777216 + ord($hash[1]) * 65536 + ord($hash[2]) * 256 + ord($hash[3]) ;
或者:
unpack("L", substr($hash,0,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;
}
bindec
不起作用(hexdec
可以)。 - hakre