您的位置:首页 > 其它

哈希存储整理(基于共享内存的实现)一

2012-08-17 10:02 309 查看
最近做了哈希存储的功能,是基于共享内存实现的,主要的业务需求是:将多个订单内的关键字做成哈希,查找时通过关键字能将含有此关键字的订单准确的查找出来。

我们用两块大的共享内存做哈希处理,当配置变更时,对其中一块内存做初始化,而不影响其他的查找进程;做完初始化之后,改变内存块的标志位,查询进程就会查询到更新的数据。

1、哈希函数

Demo:

#include <stdio.h>
#include <string.h>

/* NOTE: Arguments are modified. */
#define ccache_jhash_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); \
}

/* The golden ration: an arbitrary value */
#define CCACHE_JHASH_GOLDEN_RATIO	0x9e3779b9

typedef unsigned long ccache_u32;
typedef unsigned char ccache_u8;

static inline ccache_u32 ccache_jhash(const void *key, ccache_u32 length, ccache_u32 initval)
{
ccache_u32 a, b, c, len;
const ccache_u8 *k = key;

len = length;
a = b = CCACHE_JHASH_GOLDEN_RATIO;
c = initval;

while (len >= 12)
{
a += (k[0] +((ccache_u32)k[1]<<8) +((ccache_u32)k[2]<<16) +((ccache_u32)k[3]<<24));
b += (k[4] +((ccache_u32)k[5]<<8) +((ccache_u32)k[6]<<16) +((ccache_u32)k[7]<<24));
c += (k[8] +((ccache_u32)k[9]<<8) +((ccache_u32)k[10]<<16)+((ccache_u32)k[11]<<24));

ccache_jhash_mix(a,b,c);

k += 12;
len -= 12;
}

c += length;
switch (len)
{
case 11: c += ((ccache_u32)k[10]<<24);
case 10: c += ((ccache_u32)k[9]<<16);
case 9 : c += ((ccache_u32)k[8]<<8);
case 8 : b += ((ccache_u32)k[7]<<24);
case 7 : b += ((ccache_u32)k[6]<<16);
case 6 : b += ((ccache_u32)k[5]<<8);
case 5 : b += k[4];
case 4 : a += ((ccache_u32)k[3]<<24);
case 3 : a += ((ccache_u32)k[2]<<16);
case 2 : a += ((ccache_u32)k[1]<<8);
case 1 : a += k[0];
};

ccache_jhash_mix(a,b,c);

return c;
}

int main()
{
char getc[30];
while(scanf("%s",getc) != NULL)
{
printf("%u\n",ccache_jhash(getc,strlen(getc),0)%1000000);
}
return 0;
}


2、插入操作:所有的关键字都保存在文件中,打开关键字文件,按行读取,然后做哈希处理,对应的基本流程如下:



这其中包括了冲突的处理,因为基于共享内存的实现,offset代表离内存首地址的偏移。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: