c语言字符串转64位哈希值,murmur:更快更好的哈希函数(字符串转64位hash值)

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;

}

参数说明:

key:字符串

len:字符串长度

seed:种子,最好用一个质数

seed : 0xEE6B27EB  一个40亿内的质数

http://sites.google.com/site/murmurhash/avalanche。看上去FNV很不济 -_,-。于是就试下里面最好的murmur。这个页面正是murmur的作者做的。官网在:

http://sites.google.com/site/murmurhash/。虽然也有另外一个现成的murmur的python模块(

地址),但是是只有32bit的没有64bit的。32bit的不够用。于是只好把它64bit的源码下回来自己封装。代码不多:

100w个整数转字符串再hash的结果,FNV耗时5s+,murmur耗时1s+,快得很明显。 再随机生成长128的字符串,hash了220w+次,没有发现碰撞(跑了半个小时,没耐心了)。 不错用!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值