返回整数(32位int)的PHP哈希函数
目标是使用INT(而不是BIGINT或MEDIUMINT)将散列存储在mysql数据库上。返回整数(32位int)的PHP哈希函数,php,mysql,hash,integer,Php,Mysql,Hash,Integer,目标是使用INT(而不是BIGINT或MEDIUMINT)将散列存储在mysql数据库上。 md5('string',true)返回二进制数据,16字节的散列。我想我可以grep前4个字节,并将其转换为INT(32位/4字节)整数,但我不知道怎么做 你有什么建议?谢谢。使用,它将返回一个32位的int 输出 int(222957957) int(1292159901) 生成32位长度的循环冗余校验和多项式 这通常用于验证数据的完整性 正在传送 因为PHP的整数类型是有符号的,而且许多crc
md5('string',true)
返回二进制数据,16字节的散列。我想我可以grep前4个字节,并将其转换为INT(32位/4字节)整数,但我不知道怎么做
你有什么建议?谢谢。使用,它将返回一个32位的int
输出
int(222957957)
int(1292159901)
生成32位长度的循环冗余校验和多项式 这通常用于验证数据的完整性 正在传送 因为PHP的整数类型是有符号的,而且许多crc32校验和都是有符号的 如果生成负整数,则需要使用的“%u”格式化程序 sprintf()或printf()来获取未签名字符串的字符串表示形式 crc32校验和 或:
但菲利普·罗塞恩的解决方案更好 另一种选择是使用映射将哈希链接到整数,例如Redis L43F34FLK34FL3K4==>1 LKZLCLK32==>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;
}
函数djb_散列($str){
对于($i=0,$h=5381,$len=strlen($str);$i<$len;$i++){
$h=($h
$int=bindec(substr(md5('string',true),0,4))
或$int=hexdec(substr(md5('string'),0,8))
-但是,很明显,这并不存储整个哈希,只存储它的前4个字节。请问,这样的“哈希”目的是什么?@DaveRandom:bindec
不起作用(hexdec
)@hakre确实不起作用-为什么会这样?@cedivad:MySQL中的INT是有符号的还是无符号的?你的意思是像一个DB表,我们在其中存储哈希+一个自动递增值?或者你有没有一个解决方案,我们可以动态计算整数值?
ord($hash[0]) * 16777216 + ord($hash[1]) * 65536 + ord($hash[2]) * 256 + ord($hash[3]) ;
unpack("L", substr($hash,0,4));
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;
}