murmur3 php,murmur: 更快更好的哈希函数

以前写PHP的时候,哈希函数就只用过md5和sha1,也是最常用的两个。现在多数用python,又听说twitter用的是FNV,于是就用上了。

FNV产生的是一个整数,32位或者64位或者更多。一般用来做字符串哈希的话,需要64位。32位的碰撞率咱不放心。整数的结果,比起md5和sha1的字符串结果,存储空间要小一点。而且FNV也是比较快的。

现成的FNV的python模块是pyfasthash。这个项目名字叫pyfasthash,但模块名字叫pyhash。而且直接通过easy_install是安装不了的,在Downloads那里下载的解压出来也是安装不了的。要checkout svn里面的源码才可以。当初就是捣鼓一个晚上才发现。而且它依赖c++的boost库,编译时间很漫长。总之吐槽点很多。不过用起来还算顺手。

今晚看到了这个:http://sites.google.com/site/murmurhash/avalanche。看上去FNV很不济 -_,-。于是就试下里面最好的murmur。这个页面正是murmur的作者做的。官网在:http://sites.google.com/site/murmurhash/。虽然也有另外一个现成的murmur的python模块(地址),但是是只有32bit的没有64bit的。32bit的不够用。于是只好把它64bit的源码下回来自己封装。代码不多:

#include "Python.h"   unsigned long long MurmurHash64B ( const void * key, int len, unsigned int seed ) { const unsigned int m = 0x5bd1e995; const int r = 24;   unsigned int h1 = seed ^ len; unsigned int h2 = 0;   const unsigned int * data = (const unsigned int *)key;   while(len >= 8) { unsigned int k1 = *data++; k1 *= m; k1 ^= k1 >> r; k1 *= m; h1 *= m; h1 ^= k1; len -= 4;   unsigned int k2 = *data++; k2 *= m; k2 ^= k2 >> r; k2 *= m; h2 *= m; h2 ^= k2; len -= 4; }   if(len >= 4) { unsigned int k1 = *data++; k1 *= m; k1 ^= k1 >> r; k1 *= m; h1 *= m; h1 ^= k1; len -= 4; }   switch(len) { case 3: h2 ^= ((unsigned char*)data)[2] << 16; case 2: h2 ^= ((unsigned char*)data)[1] << 8; case 1: h2 ^= ((unsigned char*)data)[0]; h2 *= m; };

h1 ^= h2 >> 18; h1 *= m; h2 ^= h1 >> 22; h2 *= m; h1 ^= h2 >> 17; h1 *= m; h2 ^= h1 >> 19; h2 *= m;   unsigned long long h = h1;

h = (h << 32) | h2;   return h; }   static PyObject * hash(PyObject *self, PyObject *args) { const char *p; PyArg_ParseTuple(args, "s", &p); unsigned long long ret = MurmurHash64B(p, strlen(p), 0x19870714); return PyLong_FromUnsignedLongLong(ret); }   static PyMethodDef PythonPymurmurModules[] = { {"hash", hash, METH_VARARGS, "64bit murmur hash function"}, {NULL, NULL, 0, NULL} };

PyMODINIT_FUNC

initpymurmur(void) { Py_InitModule("pymurmur", PythonPymurmurModules); }

主要函数都是照搬的(看代码风格就知道 -_,-),只是改了下数据类型。uint64_t改成unsigned long long。distutils编译安装完毕。

100w个整数转字符串再hash的结果,FNV耗时5s+,murmur耗时1s+,快得很明显。

再随机生成长128的字符串,hash了220w+次,没有发现碰撞(跑了半个小时,没耐心了)。

不错用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MurmurHash 哈希算法是一种高效、简单的哈希算法,主要应用于散列表的实现。它通过对输入的数据进行多次运算,得到一个固定长度的散列值。 MurmurHash3 第三版哈希算法是 MurmurHash 的升级版本,与原版本相比,具有更高的散列精度和更优秀的碰撞处理能力。同时,它还支持 128 位散列值,可以更好地防止碰撞。 ### 回答2: MurmurHash是一种非加密的哈希算法,它能够将任意长度的数据映射为固定长度的哈希值。它被设计成快速且高效的哈希函数,适用于一些需要快速哈希计算的场景,如哈希表等。 MurmurHash3是MurmurHash系列的第三个版本,相较于之前的版本,有一些改进和优化。MurmurHash3具有良好的分散性和性能,适用于一些需要高速计算的应用场景。 MurmurHash3除了能够生成32位和128位的哈希值,还支持通过seed参数来对结果进行定制化控制。这意味着具有相同的输入数据和相同的seed参数,将得到相同的结果。MurmurHash3还支持并行处理,可以同时计算多个哈希值,提高了计算速度。 MurmurHash3相较于之前的版本,修复了一些潜在的安全漏洞,提供了更好的健壮性。同时,MurmurHash3对于输入数据的大小没有限制,其计算速度基本稳定不受输入数据长度影响。 总之,MurmurHash算法及其第三版MurmurHash3是一种高速、高效的哈希算法,常用于对数据进行快速哈希计算。它在分散性、性能和安全性上都有一定的优势,并且支持定制化控制和并行计算。 ### 回答3: MurmurHash是一种快速非加密的哈希算法,主要用于哈希表、散列索引和数据查找等应用中。它是由Austin Appleby在2008年提出的,发展成了多个版本,其中包括MurmurHash2和MurmurHash3。 MurmurHash3是MurmurHash系列中的第三版,相比于前两个版本,它有更高的哈希效率和更低的冲突率。MurmurHash3可以计算32位或128位哈希值,具体选择哪个取决于具体的应用需求。 MurmurHash3的实现包括一些变种,主要分为32位和128位两种。32位的MurmurHash3适用于一般的哈希算法需求,它使用了一些位运算和一系列常数来生成哈希值。而128位的MurmurHash3更加适用于对安全性要求较高的场景,它通过增加更多的变换步骤和混淆运算,并使用64位整数来计算哈希值。 MurmurHash3相比于前两个版本具有更好的分布性和更低的冲突率,这使得它在哈希表、哈希集等数据结构中表现更优秀。同时,MurmurHash3的计算速度也非常快速,适合用于对大量数据进行哈希运算的场景。 总的来说,MurmurHash和MurmurHash3都是高效的哈希算法,能够快速计算出哈希值。不同版本的MurmurHash有一些差异,MurmurHash3通过进一步改进和优化,提供了更好的分布性和更低的冲突率,适用于不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值