自己写的共享内存hash链表

CAlgHashList.h

#ifndef _C_ALG_HASH_LIST_H_
#define _C_ALG_HASH_LIST_H_
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "CAlgShareList.h"

#ifdef	__cplusplus
extern "C" {
   
#endif


typedef struct{
   
	unsigned int  k_size;
	unsigned int  v_size;
	unsigned int  max_count;
	unsigned int  trunk_size;
	unsigned int  trunk_mask;
	CAlgShareList free_list;
#ifdef WIN32
#pragma warning(disable:4200)
#endif
	CAlgShareList hlist[0];
#ifdef WIN32
#pragma warning(default:4200)
#endif
}CAlgHashList;

typedef struct{
   
	int            pos;
	CAlgShareList  *list;
	CAlgShareNode  *node_base; //node base address
	unsigned char  *kv_base;   //kv base address
	unsigned char  *kv;
}HashListRC;

typedef unsigned int (*Alg_Hash_F)(const void* k, unsigned int size);

static inline unsigned int CAlgHashList_Pow2(unsigned int mask)
{
   
	int order = 31;
	while((mask &  (1<< order))== 0 && order > 0)
		order --;

	return 1 << order;
}

static inline unsigned int CAlgHashList_MemSize(unsigned int key_size, unsigned int val_size,
												 unsigned int trunk_size, unsigned int max_count)
{
   
	//make trunk_size is pow of 2
	trunk_size = CAlgHashList_Pow2(trunk_size);
	return sizeof(CAlgHashList) 
		+ sizeof(CAlgShareList) * trunk_size
		+ sizeof(CAlgShareNode) * max_count
		+ (key_size + val_size) * max_count;
}

static inline void CAlgHashList_Create(CAlgHashList* h, unsigned int key_size, unsigned int val_size,
									  unsigned int trunk_size, unsigned int max_count)
{
   
	unsigned int i;
	CAlgShareNode* n = (CAlgShareNode*)((unsigned char*)(h->hlist) + sizeof(CAlgShareList) * trunk_size);
	trunk_size = CAlgHashList_Pow2(trunk_size);
	h->k_size = key_size;
	h->v_size = val_size;
	h->trunk_size = trunk_size;
	h->max_count = max_count;
	h->trunk_mask = h->trunk_size - 1;
	CAlgShareList_ReSet(&h->free_list, key_size);

	//add ShareNode to free list
	n->curr_data = NULL;
	CAlgShareList_InsertPointer(&h->free_list, NULL, NULL, n, 0);
	for(i=1; i<max_count; i++, n++){
   
		(n+1)->curr_data = NULL;
		CAlgShareList_InsertPointer(&h->free_list, 
			n, NULL, n+1, i);
	}

	for(i=0; i<trunk_size; i++){
   
		//NOTE: only set key_size, but the list node pointer store key_size + val_size
		CAlgShareList_ReSet(&h->hlist[i], key_size);
	}
}

static inline unsigned int CAlgHashList_DefaultHash(const void* k, unsigned int k_size)
{
   
	unsigned int i, hash = 0;
	const unsigned char *p = (const unsigned char *)k;

	for (i = 0; i< k_size; i++, p++) {
   
		hash = hash * 33 + *p;
	}
	return hash;
}

static inline int CAlgHashList_Find(CAlgHashList* h, const void* k, HashListRC* rc, 
									  Alg_Cmp_F cmp_f, Alg_Hash_F hash_f)
{
   
	CAlgShareList* list;
	CAlgShareNode* node_base = (CAlgShareNode*)(&h->hlist[h->trunk_size]);
	int pos;
	unsigned int hash_v ;
	unsigned char* kv_base = ((unsigned char*)node_base) + sizeof(CAlgShareNode)*h->max_count;
	unsigned int kv_size = h->k_size + h->v_size;

	if
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值