[英]How to generate a 64bit Murmur hash v2 in PHP 7.2?
我有一个MySQL数据库,该数据库具有一些Permura UDF生成的Murmur2散列(作为无符号的64位整数),该散列是随MySQL数据库的Percona链一起提供的,可在这里https://github.com/percona/build-test/ Blob /主控/插件/percona-udf/murmur_udf.cc
我的问题是,现在我需要在PHP端生成这些相同的哈希值,但是我似乎无法找到或调整任何现有的东西来为相同的输入工作/输出相同的输出。
我尝试过的事情:
段错误是由我运行此功能引起的
var_dump(murmurhash('Hello World'));
当我下载https://github.com/kibae/php_murmurhash (原始的,32位,产生哈希的扩展名)并按照说明进行操作时,该方法正常运行,但是一旦我替换了该功能(仅在MurmurHash2.cpp文件中将其编辑为https) http://github.com/StirlingMarketingGroup/php_murmurhash/blob/master/MurmurHash2.cpp ),同一函数调用会使PHP脚本崩溃。
这是我作为Percona C ++函数的端口编写的PHP函数
function murmurhash2(string $s) : int {
$len = strlen($s);
$seed = 0;
$m = 0x5bd1e995;
$r = 24;
$h1 = $seed ^ $len;
$h2 = 0;
$i = 0;
while ($len >= 8) {
$k1 = ord($s[$i++]);
$k1 *= $m; $k1 ^= $k1 >> $r; $k1 *= $m;
$h1 *= $m; $h1 ^= $k1;
$len -= 4;
$k2 = ord($s[$i++]);
$k2 *= $m; $k2 ^= $k2 >> $r; $k2 *= $m;
$h2 *= $m; $h2 ^= $k2;
$len -= 4;
}
if ($len >= 4) {
$k1 = ord($s[$i++]);
$k1 *= $m; $k1 ^= $k1 >> $r; $k1 *= $m;
$h1 *= $m; $h1 ^= $k1;
$len -= 4;
}
switch ($len) {
case 3: $h2 ^= ord($s[2]) << 16;
case 2: $h2 ^= ord($s[1]) << 8;
case 1: $h2 ^= ord($s[0]);
$h2 *= $m;
};
$h1 ^= $h2 >> 18; $h1 *= $m;
$h2 ^= $h1 >> 22; $h2 *= $m;
$h1 ^= $h2 >> 17; $h1 *= $m;
$h = $h1;
$h = ($h << 32) | $h2;
return $h;
}
在MySQL中我得到这个
select murmur_hash('Hello World'), cast(murmur_hash('Hello World')as unsigned), CONV(cast(murmur_hash('Hello World')as unsigned), 10, 16);
-- -8846466548632298438 9600277525077253178 853B098B6B655C3A
在PHP中我得到
var_dump(murmurhash2('Hello World'));
// int(5969224437940092928)
因此,查看MySQL和PHP结果,有符号和无符号都不匹配我的PHP输出。
我的前两种方法是否可以解决某些问题,或者可以替代使用一种已经有效的方法?
我已经通过将Percona哈希函数直接移植到PHP扩展MySQL来解决了这个问题。
安装和使用说明发布在这里https://github.com/StirlingMarketingGroup/php-murmur-hash
在MySQL中,Percona扩展的用法类似于
select`murmur_hash`('Yeet')
-- -7850704420789372250
而在PHP中
php -r 'echo murmur_hash("Yeet");'
// -7850704420789372250
请注意,两种环境都将它们视为有符号整数,您可以在MySQL中通过使用cast(`murmur_hash`('Yeet')as unsigned)
,但PHP不支持无符号整数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.