目标是使用INT(不是BIGINT或MEDIUMINT)将哈希值存储在mysql数据库中。md5('string', true)返回二进制数据,16个字节的哈希值。我以为我可以grep前4个字节并将其转换为INT(32位/4字节)整数,但我不知道如何操作。你有什么建议?谢谢。
md5('string', true)
f1tvaqid1#
使用crc32,它将返回一个32位的int。
crc32
int
var_dump (crc32 ("hello world")); var_dump (crc32 ("world hello"));
输出
int(222957957) int(1292159901)
∮ ∮ ∮ ∮生成字符串长度为32位的循环冗余校验和多项式。这通常用于验证传输数据的完整性。因为PHP的整数类型是带符号的,并且许多crc32校验和将导致负整数,所以您需要使用sprintf()或printf()的“%u”格式化程序来获取无符号crc32校验和的字符串表示。
lsmepo6l2#
php hash()函数甚至比crc32()更好:
hash()
crc32()
hash("crc32b", $str);
如果需要整数:
intval(hash("crc32b", $str), 16);
与普通的crc32()相比,它不会受到32位和64位系统之间有符号/无符号整数不一致的影响(有关详细信息,请参阅PHP文档:crc32)
4jb9z9bj3#
ord($hash[0]) * 16777216 + ord($hash[1]) * 65536 + ord($hash[2]) * 256 + ord($hash[3]) ;
或者:
unpack("L", substr($hash,0,4));
但菲利普·罗森的解决方案更好。
azpvetkf4#
另一种选择是使用Map将哈希值链接到整数,如Redis。长43英尺34英尺34英尺34英尺34英尺4英尺==〉1LKZLCKCLK32 ==〉2等等。
hujrc8aj5#
这是丹尼尔J.伯恩斯坦散列函数,它返回一个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条答案
按热度按时间f1tvaqid1#
使用
crc32
,它将返回一个32位的int
。输出
∮ ∮ ∮ ∮
生成字符串长度为32位的循环冗余校验和多项式。这通常用于验证传输数据的完整性。
因为PHP的整数类型是带符号的,并且许多crc32校验和将导致负整数,所以您需要使用sprintf()或printf()的“%u”格式化程序来获取无符号crc32校验和的字符串表示。
lsmepo6l2#
php
hash()
函数甚至比crc32()
更好:如果需要整数:
与普通的
crc32()
相比,它不会受到32位和64位系统之间有符号/无符号整数不一致的影响(有关详细信息,请参阅PHP文档:crc32)4jb9z9bj3#
或者:
但菲利普·罗森的解决方案更好。
azpvetkf4#
另一种选择是使用Map将哈希值链接到整数,如Redis。
长43英尺34英尺34英尺34英尺34英尺4英尺==〉1
LKZLCKCLK32 ==〉2
等等。
hujrc8aj5#
这是丹尼尔J.伯恩斯坦散列函数,它返回一个32位整数。