哈希存储整理(基于共享内存的实现)一
2012-08-17 10:02
309 查看
最近做了哈希存储的功能,是基于共享内存实现的,主要的业务需求是:将多个订单内的关键字做成哈希,查找时通过关键字能将含有此关键字的订单准确的查找出来。
我们用两块大的共享内存做哈希处理,当配置变更时,对其中一块内存做初始化,而不影响其他的查找进程;做完初始化之后,改变内存块的标志位,查询进程就会查询到更新的数据。
1、哈希函数
Demo:
2、插入操作:所有的关键字都保存在文件中,打开关键字文件,按行读取,然后做哈希处理,对应的基本流程如下:
这其中包括了冲突的处理,因为基于共享内存的实现,offset代表离内存首地址的偏移。
我们用两块大的共享内存做哈希处理,当配置变更时,对其中一块内存做初始化,而不影响其他的查找进程;做完初始化之后,改变内存块的标志位,查询进程就会查询到更新的数据。
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代表离内存首地址的偏移。
相关文章推荐
- 哈希存储整理(基于共享内存的实现)二
- 基于jQuery实现的文字按钮表单特效整理
- 哈希表-散列表-哈希存储-代码实现
- 基于MogileFS+mysql+nginx实现分布文件存储与访问 推荐
- [原创]实现基于Memcache存储的Session类
- JavaScript系列-----对象基于哈希存储(<Key,Value>之Key篇) (1)
- (原创)基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现)
- 实现基于Memcache存储的Session类
- 基于jQuery实现的图片切换焦点图整理
- 资料整理:基于node push server实现push notification
- 基于邻接矩阵存储的无向网图的创建,最小生成树算法实现完整代码
- 基于Unity3D的JSON文件的存储的实现
- [原创]实现基于文件存储的Session类
- 实现基于文件存储的Session类
- 基于RHCS+ISCSI+CLVM实现web服务的共享存储集群架构
- 70-316 使用Microsoft Visual C# .NET and Microsoft Visual Studio .NET 开发及实现基于Windows的应用程序 考点整理
- 基于ini配置文件实现多维数组数据的按行存储和读取
- 实现基于SQLServer存储账号的MDaemon群集
- 基于AVI的网络视频监控存储系统的实现方法
- windows下多进程通信,基于共享内存环形队列实现