murmurhash的php实现

MurmurHash PHP 实现
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。以下是 PHP 的实现方式:

方法一:直接实现 MurmurHash3
function murmurhash3($key, $seed = 0) {
$key = (string)$key;
$len = strlen($key);
$h1 = $seed;
$c1 = 0xcc9e2d51;
$c2 = 0x1b873593;
$i = 0;
while ($i <= $len - 4) {
$k1 = ord($key[$i]) | (ord($key[$i + 1]) << 8) | (ord($key[$i + 2]) << 16) | (ord($key[$i + 3]) << 24);
$k1 = ($k1 * $c1) & 0xFFFFFFFF;
$k1 = ($k1 << 15) | ($k1 >> 17);
$k1 = ($k1 * $c2) & 0xFFFFFFFF;
$h1 ^= $k1;
$h1 = ($h1 << 13) | ($h1 >> 19);
$h1 = ($h1 * 5 + 0xe6546b64) & 0xFFFFFFFF;
$i += 4;
}
$k1 = 0;
switch ($len - $i) {
case 3: $k1 ^= ord($key[$i + 2]) << 16;
case 2: $k1 ^= ord($key[$i + 1]) << 8;
case 1: $k1 ^= ord($key[$i]);
$k1 = ($k1 * $c1) & 0xFFFFFFFF;
$k1 = ($k1 << 15) | ($k1 >> 17);
$k1 = ($k1 * $c2) & 0xFFFFFFFF;
$h1 ^= $k1;
}
$h1 ^= $len;
$h1 ^= ($h1 >> 16);
$h1 = ($h1 * 0x85ebca6b) & 0xFFFFFFFF;
$h1 ^= ($h1 >> 13);
$h1 = ($h1 * 0xc2b2ae35) & 0xFFFFFFFF;
$h1 ^= ($h1 >> 16);
return $h1;
}
方法二:使用扩展库
若 PHP 环境允许安装扩展,可以使用 murmurhash 扩展:
- 安装扩展:
pecl install murmurhash - 在 PHP 中调用:
$hash = murmurhash("input string");
注意事项
- 32 位与 64 位系统可能产生不同结果,需根据环境调整实现。
- 直接实现的版本未处理大端序/小端序问题,跨平台时需额外注意。
- 对于生产环境,建议使用扩展或已验证的库(如
hashids等封装库)。
性能优化
- 避免在循环中频繁调用 MurmurHash,可缓存结果。
- 对短字符串哈希,直接实现可能比扩展更快;长字符串则相反。
以上代码可直接用于项目,需根据实际需求调整种子($seed)值。






