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

rfbsl7qr  于 2023-01-12  发布在  PHP
关注(0)|答案(5)|浏览(123)

目标是使用INT(不是BIGINT或MEDIUMINT)将哈希值存储在mysql数据库中。md5('string', true)返回二进制数据,16个字节的哈希值。我以为我可以grep前4个字节并将其转换为INT(32位/4字节)整数,但我不知道如何操作。
你有什么建议?谢谢。

f1tvaqid

f1tvaqid1#

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

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

输出

int(222957957)
int(1292159901)

∮ ∮ ∮ ∮
生成字符串长度为32位的循环冗余校验和多项式。这通常用于验证传输数据的完整性。
因为PHP的整数类型是带符号的,并且许多crc32校验和将导致负整数,所以您需要使用sprintf()或printf()的“%u”格式化程序来获取无符号crc32校验和的字符串表示。

lsmepo6l

lsmepo6l2#

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

hash("crc32b", $str);

如果需要整数:

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

与普通的crc32()相比,它不会受到32位和64位系统之间有符号/无符号整数不一致的影响(有关详细信息,请参阅PHP文档:crc32

4jb9z9bj

4jb9z9bj3#

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

或者:

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

但菲利普·罗森的解决方案更好。

azpvetkf

azpvetkf4#

另一种选择是使用Map将哈希值链接到整数,如Redis。
长43英尺34英尺34英尺34英尺34英尺4英尺==〉1
LKZLCKCLK32 ==〉2
等等。

hujrc8aj

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

相关问题