Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回整数(32位int)的PHP哈希函数_Php_Mysql_Hash_Integer - Fatal编程技术网

返回整数(32位int)的PHP哈希函数

返回整数(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

目标是使用INT(而不是BIGINT或MEDIUMINT)将散列存储在mysql数据库上。
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;
}