Jenkins hash算法

本文介绍了Jenkins hash算法,一种高效的散列算法,被广泛应用于memcached等系统中。该算法能够提供良好的散列分布特性,适用于哈希表的开放寻址实现。文章详细展示了Jenkins hash的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jenkins hash算法, memcached使用了此算法
Jenkins hash,可能是目前能看到的最好的hash算法之一,可以产生很好的分布,缺点是相比其他常见的hash算法更耗时。可以考虑用于hash表的open addressing实现上。如果想了解细节的话,可以去Bob Jenkins的站点看一看。
#define hashsize(n) ( 1U << (n) )
#define hashmask(n) ( hashsize ( n ) – 1 )
#define mix(a,b,c)
{
a -= b; a -= c; a ^= ( c >> 13 );
b -= c; b -= a; b ^= ( a << 8 );
c -= a; c -= b; c ^= ( b >> 13 );
a -= b; a -= c; a ^= ( c >> 12 );
b -= c; b -= a; b ^= ( a << 16 );
c -= a; c -= b; c ^= ( b >> 5 );
a -= b; a -= c; a ^= ( c >> 3 );
b -= c; b -= a; b ^= ( a << 10 );
c -= a; c -= b; c ^= ( b >> 15 );
}
unsigned jen_hash ( unsigned char *k,
unsigned length, unsigned initval )
{
unsigned a, b;
unsigned c = initval;
unsigned len = length;
a = b = 0x9e3779b9;
while ( len >= 12 ) {
a += ( k[0] + ( (unsigned)k[1] << 8 )
+ ( (unsigned)k[2] << 16 )
+ ( (unsigned)k[3] << 24 ) );
b += ( k[4] + ( (unsigned)k[5] << 8 )
+ ( (unsigned)k[6] << 16 )
+ ( (unsigned)k[7] << 24 ) );
c += ( k[8] + ( (unsigned)k[9] << 8 )
+ ( (unsigned)k[10] << 16 )
+ ( (unsigned)k[11] << 24 ) );
mix ( a, b, c );
k += 12;
len -= 12;
}
c += length;
switch ( len ) {
case 11: c += ( (unsigned)k[10] << 24 );
case 10: c += ( (unsigned)k[9] << 16 );
case 9 : c += ( (unsigned)k[8] << 8 );
/* First byte of c reserved for length */
case 8 : b += ( (unsigned)k[7] << 24 );
case 7 : b += ( (unsigned)k[6] << 16 );
case 6 : b += ( (unsigned)k[5] << 8 );
case 5 : b += k[4];
case 4 : a += ( (unsigned)k[3] << 24 );
case 3 : a += ( (unsigned)k[2] << 16 );
case 2 : a += ( (unsigned)k[1] << 8 );
case 1 : a += k[0];
}
mix ( a, b, c );
return c;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值