AMPS:哈希表源码解读
2013-01-21 22:24
465 查看
Hash表也是一种常用的数据结构,AMPS中的Hash表并不是给使用者提供一个散列函数,而是仅提供一个创建和维护Hash表这样一个结构的一组函数,针对不同的应用或者数据,由用户自己定义其要使用的散列函数,AMPS中,Hash表组成结构是如下的拉链式结构。
下面看看AMPS中对Hash操作的代码:
AMPS_Hash.h
AMPS_Hash.c
下面看看AMPS中对Hash操作的代码:
AMPS_Hash.h
#ifndef __HEADER_AMPS_HASH_H #define __HEADER_AMPS_HASH_H #ifdef __cplusplus extern "C" { #endif #include "AMPS_API.h" #include "AMPS_Defines.h" #include "AMPS_LinkList.h" //#define AMPS_HASH_TABLE_KEY_SIZE 1009 // Prime Nos : 1009, 11003, 11027, 50021, 50023, 100019 typedef struct _HASHTableEntry t_HASHTableEntry; typedef struct _HASHTableNode t_HASHTableNode; typedef struct _HASHTable t_HASHTable; typedef struct _HASHTableUserData t_HASHTableUserData; typedef int(*HashTable_InsertCallback)(void* r_pvAMPSContext, void* r_pvHASHTable, void* r_pvData, t_AMPSHashTableKey* r_poHASHKey); typedef void*(*HashTable_SearchCallback)(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); typedef int(*HashTable_DeleteCallback)(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); struct _HASHTableEntry { t_AMPSDList* poDListOfHashTableNode; //list of t_HASHTableNode }; /*Hash表结点结构*/ struct _HASHTableNode { t_AMPSSList* poSListNodeBackPtr; /*具有相同key值的各数据节点*/ void* pvAMPSContext; t_AMPSHashTableKey oHASHKey; int nHashTableIndex; void* pvData; //Node specific pvData }; /*Hash表结构*/ struct _HASHTable { t_HASHTableEntry* poHASHTableEntry; /*存放各节点的值*/ int nHashTableSize; /*结点个数*/ //variable functions AMPS_HashTableHashCallback pfAMPS_HashTableHashCallback; /*散列函数*/ HashTable_InsertCallback pfHashTable_InsertCallback; HashTable_SearchCallback pfHashTable_SearchCallback; HashTable_DeleteCallback pfHashTable_DeleteCallback; }; struct _HASHTableUserData { AMPS_HashTableProcessNodeDataCallback pfAMPS_HashTableProcessNodeDataCallback; AMPS_APP_HANDLE hAMPS_APP_HANDLE; }; void* HashTable_Create(void* r_pvAMPSContext, int r_SizeOfHashTable, AMPS_HashTableHashCallback r_pfAMPS_HashTableHashCallback); void HashTable_Delete (void* r_pvAMPSContext, void* r_pvHASHTable); void HashTable_DeleteAllEntries(void* r_pvAMPSContext, void* r_pvHASHTable, AMPS_HashTableProcessNodeDataCallback r_pfAMPS_HashTableProcessNodeDataCallback, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE); void HashTable_TraverseAllEntries(void* r_pvAMPSContext, void* r_pvHASHTable, AMPS_HashTableProcessNodeDataCallback r_pfAMPS_HashTableProcessNodeDataCallback, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE); void HashTable_ProcessNodeData(void* r_pvListNodeData, void* r_pvArg); unsigned int HashTable_Main(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); int HashTable_Insert(void* r_pvAMPSContext, void* r_pvHASHTable, void* r_pvData, t_AMPSHashTableKey* r_poHASHKey); int HashTable_RemoveByHandle(void* r_pvAMPSContext, void* r_pvHASHTable, int r_nHandle); int HashTable_RemoveByKey(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); void* HashTable_Search(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); void* HashTable_LookupByHandleAndHashKey(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey, int r_nHandle); void* HashTable_LookupByHandle(void* r_pvAMPSContext, void* r_pvHASHTable, int r_nHandle); void* HashTable_SearchData (void* r_pvAMPSContext, t_AMPSDList* r_pDList, t_AMPSHashTableKey* r_poHASHKey); void* HashTable_CreateAndAppendNode (void* r_pvAMPSContext, t_AMPSDList* r_poDList, void* r_pvData, t_AMPSHashTableKey* r_poHASHKey, int r_nHashTableIndex); int HashTable_FreeNodeData (void** r_ppvHASHTableNode); int HashTable_CompareNodeKey(void* r_pvHASHKey, void* r_pvHashTableNode); void HashTable_FreeNodeDataEx(void* r_pvListNodeData, void* r_pvArg); unsigned int HashTable_StringSum (void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); unsigned int HashTable_Universal (void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); unsigned int HashTable_HashFunc1(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey); #ifdef __cplusplus } #endif #endif //__HEADER_AMPS_HASH_H
AMPS_Hash.c
/***************************************************************** 文件名称: AMPS_Hash.c 功能描述: 拉链式存储的Hash表操作函数库 *****************************************************************/ #include "AMPS_Core.h" #include "AMPS_Defines.h" #include "AMPS_MemMgt.h" #include "AMPS_Hash.h" #include "AMPS_LinkList.h" /***************************************************************** 函数名称: HashTable_Create 功能描述: 建立Hash表 入参:: void* r_pvAMPSContext AMPS应用上下文 int r_nSizeOfHashTable Hash表总大小 AMPS_HashTableHashCallback r_pfAMPS_HashTableHashCallback 回调函数 出参: 返回值: void* 创建的Hash表 *****************************************************************/ void* HashTable_Create(void* r_pvAMPSContext, int r_nSizeOfHashTable, AMPS_HashTableHashCallback r_pfAMPS_HashTableHashCallback) { t_HASHTable* poHASHTable = NULL; int nCounter = 0; TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); poHASHTable = AMPS_InternalMalloc(sizeof (t_HASHTable)); if (NULL == poHASHTable) { return NULL; } poHASHTable->poHASHTableEntry = AMPS_InternalMalloc(sizeof(t_HASHTableEntry) * r_nSizeOfHashTable); if (NULL == poHASHTable->poHASHTableEntry) { AMPS_InternalFree (poHASHTable); return NULL; } poHASHTable->nHashTableSize = r_nSizeOfHashTable; if (NULL == r_pfAMPS_HashTableHashCallback) { poHASHTable->pfAMPS_HashTableHashCallback = HashTable_HashFunc1; } else { poHASHTable->pfAMPS_HashTableHashCallback = r_pfAMPS_HashTableHashCallback; } /*结点存放在双向链表中*/ for (; nCounter < poHASHTable->nHashTableSize; nCounter++) { if (NULL == DList_Init (&poHASHTable->poHASHTableEntry[nCounter].poDListOfHashTableNode)) { return NULL; } } TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); return poHASHTable; } /***************************************************************** 函数名称: HashTable_Delete 功能描述: 释放Hash表 入参:: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable Hash表句柄 出参: t_AMPSDList* 操作后的链表 返回值: NA *****************************************************************/ void HashTable_Delete(void* r_pvAMPSContext, void* r_pvHASHTable) { t_HASHTable* poHASHTable = (t_HASHTable*)r_pvHASHTable; int nCounter = 0; TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); for (; nCounter < poHASHTable->nHashTableSize; nCounter++) { DList_Free(&poHASHTable->poHASHTableEntry[nCounter].poDListOfHashTableNode, HashTable_FreeNodeData); } AMPS_InternalFree(poHASHTable->poHASHTableEntry); AMPS_InternalFree (poHASHTable); TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); } /***************************************************************** 函数名称: HashTable_TraverseAllEntries 功能描述: 遍历并处理Hash表各结点 入参:: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable Hash表句柄 AMPS_HashTableProcessNodeDataCallback r_pfAMPS_HashTableProcessNodeDataCallback 出参: t_AMPSDList* 操作后的链表 返回值: NA *****************************************************************/ void HashTable_TraverseAllEntries(void* r_pvAMPSContext, void* r_pvHASHTable, AMPS_HashTableProcessNodeDataCallback r_pfAMPS_HashTableProcessNodeDataCallback, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE) { t_HASHTable* poHASHTable = (t_HASHTable*)r_pvHASHTable; int nCounter = 0; TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); if((NULL != r_pfAMPS_HashTableProcessNodeDataCallback) || (NULL != r_hAMPS_APP_HANDLE)) { t_HASHTableUserData oHASHTableUserData; oHASHTableUserData.hAMPS_APP_HANDLE = r_hAMPS_APP_HANDLE; oHASHTableUserData.pfAMPS_HashTableProcessNodeDataCallback = r_pfAMPS_HashTableProcessNodeDataCallback; for (; nCounter < poHASHTable->nHashTableSize; nCounter++) { DList_Traverse(poHASHTable->poHASHTableEntry[nCounter].poDListOfHashTableNode, HashTable_ProcessNodeData, &oHASHTableUserData); } } } /***************************************************************** 函数名称: HashTable_ProcessNodeData 功能描述: 处理各节点 入参:: void* r_pvListNodeData 结点数据 void* r_pvArg 参数 出参: 返回值: NA *****************************************************************/ void HashTable_ProcessNodeData(void* r_pvListNodeData, void* r_pvArg) { t_HASHTableNode* poHASHTableNode = r_pvListNodeData; t_HASHTableUserData* poHASHTableUserData = r_pvArg; t_AMPSContext* poAMPSContext = poHASHTableNode->pvAMPSContext; TRACE(HASH_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); poHASHTableUserData->pfAMPS_HashTableProcessNodeDataCallback(poAMPSContext, poHASHTableUserData->hAMPS_APP_HANDLE, poHASHTableNode->pvData); TRACE( HASH_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); } /***************************************************************** 函数名称: HashTable_DeleteAllEntries 功能描述: 处理各节点 入参:: void* r_pvAMPSContext 应用上下文 void* r_pvHASHTable hash表 AMPS_HashTableProcessNodeDataCallback r_pfAMPS_HashTableProcessNodeDataCallback AMPS_APP_HANDLE r_hAMPS_APP_HANDLE 应用句柄 出参: 返回值: NA *****************************************************************/ void HashTable_DeleteAllEntries(void* r_pvAMPSContext, void* r_pvHASHTable, AMPS_HashTableProcessNodeDataCallback r_pfAMPS_HashTableProcessNodeDataCallback, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE) { t_HASHTable* poHASHTable = (t_HASHTable*)r_pvHASHTable; int nCounter = 0; TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); if((NULL == r_pfAMPS_HashTableProcessNodeDataCallback) || (NULL == r_hAMPS_APP_HANDLE)) { for (; nCounter < poHASHTable->nHashTableSize; nCounter++) { /*释放并初始化各结点*/ DList_Free(&poHASHTable->poHASHTableEntry[nCounter].poDListOfHashTableNode, HashTable_FreeNodeData); if (NULL == DList_Init (&poHASHTable->poHASHTableEntry[nCounter].poDListOfHashTableNode)) { TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR,"unable to re-create node list\n"); return; } } } else { t_HASHTableUserData oHASHTableUserData; oHASHTableUserData.hAMPS_APP_HANDLE = r_hAMPS_APP_HANDLE; oHASHTableUserData.pfAMPS_HashTableProcessNodeDataCallback = r_pfAMPS_HashTableProcessNodeDataCallback; for (; nCounter < poHASHTable->nHashTableSize; nCounter++) { /*释放前处理结点*/ DList_FreeEx(&poHASHTable->poHASHTableEntry[nCounter].poDListOfHashTableNode, HashTable_FreeNodeDataEx, &oHASHTableUserData); if (NULL == DList_Init(&poHASHTable->poHASHTableEntry[nCounter].poDListOfHashTableNode)) { TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR,"unable to re-create node list\n"); return; } } } } /***************************************************************** 函数名称: HashTable_FreeNodeData 功能描述: 释放节点 入参:: void** r_ppvHASHTableNode 要释放的结点 出参: 返回值: int *****************************************************************/ int HashTable_FreeNodeData(void** r_ppvHASHTableNode) { t_HASHTableNode* poHASHTableNode = (t_HASHTableNode*)(*r_ppvHASHTableNode); //t_AMPSContext* poAMPSContext = (t_AMPSContext*)poHASHTableNode->pvAMPSContext; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); memset(poHASHTableNode->oHASHKey.puchKey, 0, poHASHTableNode->oHASHKey.unKeyLength); AMPS_InternalFree(poHASHTableNode); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); return AMPS_SUCCESS; } /***************************************************************** 函数名称: HashTable_FreeNodeDataEx 功能描述: 释放节点 入参:: void** r_ppvHASHTableNode 要释放的结点 void* r_pvArg 参数 出参: 返回值: int *****************************************************************/ void HashTable_FreeNodeDataEx(void* r_pvListNodeData, void* r_pvArg) { t_HASHTableNode* poHASHTableNode = r_pvListNodeData; t_HASHTableUserData* poHASHTableUserData = r_pvArg; t_AMPSContext* poAMPSContext = poHASHTableNode->pvAMPSContext; TRACE(HASH_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); poHASHTableUserData->pfAMPS_HashTableProcessNodeDataCallback(poAMPSContext, poHASHTableUserData->hAMPS_APP_HANDLE, poHASHTableNode->pvData); AMPS_InternalFree(poHASHTableNode); TRACE( HASH_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); } /***************************************************************** 函数名称: HashTable_FreeNodeDataEx 功能描述: 插入结点 入参: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable Hash指针 void* r_pvData 结点内容 t_AMPSHashTableKey* r_poHASHKey 索引值 出参: 返回值: int *****************************************************************/ int HashTable_Insert(void* r_pvAMPSContext, void* r_pvHASHTable, void* r_pvData, t_AMPSHashTableKey* r_poHASHKey) { t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_HASHTable* poHASHTable = (t_HASHTable*)r_pvHASHTable; void* pvHASHTableNode = NULL; unsigned int nHashTableIndex = 0; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); /*得到一个位置*/ nHashTableIndex = HashTable_Main(poAMPSContext, poHASHTable, r_poHASHKey); if (0 > nHashTableIndex) { return AMPS_INVALID_HANDLE; } /*第一个结点*/ if (poHASHTable->poHASHTableEntry[nHashTableIndex].poDListOfHashTableNode->poAMPSSListHead == NULL) { pvHASHTableNode = HashTable_CreateAndAppendNode (poAMPSContext, poHASHTable->poHASHTableEntry[nHashTableIndex].poDListOfHashTableNode, r_pvData, r_poHASHKey, nHashTableIndex); if (NULL == pvHASHTableNode) { return AMPS_INVALID_HANDLE; } } else { //DList_Search will return NULL(last poAMPSSListNext pointer) if table entry deos not exist if (NULL == DList_Search(poHASHTable->poHASHTableEntry[nHashTableIndex].poDListOfHashTableNode, HashTable_CompareNodeKey, r_poHASHKey)) { pvHASHTableNode = HashTable_CreateAndAppendNode (poAMPSContext, poHASHTable->poHASHTableEntry[nHashTableIndex].poDListOfHashTableNode, r_pvData, r_poHASHKey, nHashTableIndex); if (NULL == pvHASHTableNode) { return AMPS_INVALID_HANDLE; } } else { //ERROR HANDLING TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_WARNING, "Entery already exist.\n"); return AMPS_INVALID_HANDLE; } } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); return((int)pvHASHTableNode); } /***************************************************************** 函数名称: HashTable_CreateAndAppendNode 功能描述: 插入结点 入参: void* r_pvAMPSContext AMPS应用上下文 t_AMPSDList* r_poDList, hash表中的结点链表 void* r_pvData, 要追加的结点数据 t_AMPSHashTableKey* r_poHASHKey 要追加的结点的k值 int r_nHashTableIndex index 出参: 返回值: int *****************************************************************/ void* HashTable_CreateAndAppendNode(void* r_pvAMPSContext, t_AMPSDList* r_poDList, void* r_pvData, t_AMPSHashTableKey* r_poHASHKey, int r_nHashTableIndex) { //t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_AMPSSList* poSListNode = NULL; t_HASHTableNode* poHASHTableNode = NULL; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); /*创建结点*/ poHASHTableNode = AMPS_InternalMalloc (sizeof(t_HASHTableNode)); if (NULL == poHASHTableNode) { return NULL; } /*结点赋值*/ poHASHTableNode->pvAMPSContext = r_pvAMPSContext; poHASHTableNode->pvData = r_pvData; poHASHTableNode->nHashTableIndex = r_nHashTableIndex; if (AMPS_HASH_TABLE_KEY_SIZE < r_poHASHKey->unKeyLength) { AMPS_InternalFree(poHASHTableNode); return NULL; } strncpy((char*)poHASHTableNode->oHASHKey.puchKey, (char*)r_poHASHKey->puchKey, r_poHASHKey->unKeyLength); poHASHTableNode->oHASHKey.unKeyLength = r_poHASHKey->unKeyLength; poSListNode = (t_AMPSSList*)AMPS_InternalMalloc(sizeof(t_AMPSSList)); if (NULL == poSListNode) { memset(poHASHTableNode->oHASHKey.puchKey, 0, poHASHTableNode->oHASHKey.unKeyLength); AMPS_InternalFree(poHASHTableNode); return NULL; } poHASHTableNode->poSListNodeBackPtr = poSListNode; /*将结点挂在Hash中的双向链表中*/ DList_PrependGivenNode(r_poDList, poHASHTableNode, poSListNode); /*if(r_poDList->uchCount > 15) printf("r_poDList->uchCount %d\n", r_poDList->uchCount);*/ //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); return poHASHTableNode; } /***************************************************************** 函数名称: HashTable_RemoveByHandle 功能描述: 删除结点 入参: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable int r_nHandle 出参: 返回值: int *****************************************************************/ int HashTable_RemoveByHandle(void* r_pvAMPSContext, void* r_pvHASHTable, int r_nHandle) { //t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; //这句是错的吧 t_HASHTableNode* poHASHTableNode = (t_HASHTableNode*)r_nHandle; t_AMPSSList* poSListNode = poHASHTableNode->poSListNodeBackPtr; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); if (AMPS_SUCCESS != DList_Remove(&poHashTable->poHASHTableEntry[poHASHTableNode->nHashTableIndex].poDListOfHashTableNode, poSListNode, HashTable_FreeNodeData)) { return AMPS_ERROR_FAILURE; } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); return AMPS_SUCCESS; } /***************************************************************** 函数名称: HashTable_RemoveByKey 功能描述: 删除结点 入参: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable t_AMPSHashTableKey* r_poHASHKey 出参: 返回值: int *****************************************************************/ int HashTable_RemoveByKey(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey) { t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; t_AMPSSList* poSListNode = NULL; unsigned int unHashTableIndex = 0; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); unHashTableIndex = HashTable_Main(poAMPSContext, poHashTable, r_poHASHKey); poSListNode = DList_Search(poHashTable->poHASHTableEntry[unHashTableIndex].poDListOfHashTableNode, HashTable_CompareNodeKey, r_poHASHKey); if (NULL != poSListNode) { return(DList_Remove(&poHashTable->poHASHTableEntry[unHashTableIndex].poDListOfHashTableNode, poSListNode, HashTable_FreeNodeData)); } else { return AMPS_ERROR_FAILURE; } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving\n"); return AMPS_SUCCESS; } /***************************************************************** 函数名称: HashTable_Search 功能描述: 查找结点 入参: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable t_AMPSHashTableKey* r_poHASHKey 出参: 返回值: int *****************************************************************/ void* HashTable_Search(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey) { t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; unsigned int unHashTableIndex = 0; t_AMPSSList* poSListNode = NULL; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); unHashTableIndex = HashTable_Main(r_pvAMPSContext, poHashTable, r_poHASHKey); //retrieve index for Node //Search the indexed list if (NULL != poHashTable->poHASHTableEntry[unHashTableIndex].poDListOfHashTableNode) { poSListNode = poHashTable->poHASHTableEntry[unHashTableIndex].poDListOfHashTableNode->poAMPSSListHead; if (NULL == poSListNode) { return NULL; } /*找到*/ //if required pvData is in the first node? if (AMPS_SUCCESS == HashTable_CompareNodeKey (r_poHASHKey, poSListNode->pvData)) { return((t_HASHTableNode*)poSListNode->pvData)->pvData; } //proceed to perform list search return(HashTable_SearchData (poAMPSContext, poHashTable->poHASHTableEntry[unHashTableIndex].poDListOfHashTableNode, r_poHASHKey)); } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return NULL; } /***************************************************************** 函数名称: HashTable_LookupByHandleAndHashKey 功能描述: 查找结点(使用handle和key) 入参: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable t_AMPSHashTableKey* r_poHASHKey 出参: 返回值: int *****************************************************************/ void* HashTable_LookupByHandleAndHashKey(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey, int r_nHandle) { //t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; //t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; t_HASHTableNode* poHASHTableNode = (t_HASHTableNode*)r_nHandle; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); if (AMPS_SUCCESS == HashTable_CompareNodeKey (r_poHASHKey, poHASHTableNode)) { return(poHASHTableNode->pvData); } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return NULL; } /***************************************************************** 函数名称: HashTable_LookupByHandle 功能描述: 查找结点数据(使用handle) 入参: void* r_pvAMPSContext AMPS应用上下文 void* r_pvHASHTable t_AMPSHashTableKey* r_poHASHKey 出参: 返回值: int *****************************************************************/ void* HashTable_LookupByHandle(void* r_pvAMPSContext, void* r_pvHASHTable, int r_nHandle) { //t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; //t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; //真没有理解 t_HASHTableNode* poHASHTableNode = (t_HASHTableNode*)r_nHandle; void* pvData = NULL; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); pvData = poHASHTableNode->pvData; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return pvData; } /***************************************************************** 函数名称: HashTable_CompareNodeKey 功能描述: 比较指定的key是否与结点内容匹配 入参: void* r_pvHASHKey void* r_pvHashTableNode 出参: 返回值: int *****************************************************************/ int HashTable_CompareNodeKey(void* r_pvHASHKey, void* r_pvHashTableNode) { t_AMPSHashTableKey* poHASHKey = (t_AMPSHashTableKey*)r_pvHASHKey; t_HASHTableNode* poHASHTableNode = (t_HASHTableNode*)r_pvHashTableNode; //t_AMPSContext* poAMPSContext = (t_AMPSContext*)poHASHTableNode->pvAMPSContext; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); //if(poHASHKey->unKeyLength == poHASHTableNode->oHASHKey.unKeyLength) { if (0 == SAPI_StrnCaseCMP((char*)poHASHKey->puchKey, (char*)poHASHTableNode->oHASHKey.puchKey, poHASHKey->unKeyLength)) { return AMPS_SUCCESS; } } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return AMPS_ERROR_FAILURE; } /***************************************************************** 函数名称: HashTable_SearchData 功能描述: 查找指定key值对应的数据 入参: void* r_pvAMPSContext 应用上下文 t_AMPSDList* r_pDList Hash内的双链表 t_AMPSHashTableKey* 指定的key值 出参: 返回值: int *****************************************************************/ void* HashTable_SearchData (void* r_pvAMPSContext, t_AMPSDList* r_pDList, t_AMPSHashTableKey* r_poHASHKey) { //t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_AMPSSList* poSListNode = NULL; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); poSListNode = DList_Search(r_pDList, HashTable_CompareNodeKey, r_poHASHKey); if (NULL != poSListNode) { if (NULL != poSListNode->pvData) { return(((t_HASHTableNode*)poSListNode->pvData)->pvData); //return actual pvData, pvData inside t_HASHTableNode } } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return NULL; } /***************************************************************** 函数名称: HashTable_SearchData 功能描述: 获取指定key的位置 入参: void* r_pvAMPSContext 应用上下文 t_AMPSDList* r_pDList Hash内的双链表 t_AMPSHashTableKey* 指定的key值 出参: 返回值: int *****************************************************************/ unsigned int HashTable_Main(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey) { t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Hash Key Length = %d\n", r_poHASHKey->unKeyLength); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Hash Key = %s\n", r_poHASHKey->puchKey); if (NULL != poHashTable->pfAMPS_HashTableHashCallback) { /*使用hash函数得到一个位置,这个函数在hash表初始化时由用户定义*/ return(poHashTable->pfAMPS_HashTableHashCallback (poAMPSContext, poHashTable, r_poHASHKey)); } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return AMPS_ERROR_FAILURE; } /***************************************************************** 下面为几个Hash散列函数举例 *****************************************************************/ //A simple Hash Function for String keys unsigned int HashTable_StringSum (void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey) { //t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; //Sum all the characters that make up the KEY unsigned int nHashTableIndex = 0; unsigned int unCounter = 0; int nSum = 0; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); for (unCounter = 0; unCounter < r_poHASHKey->unKeyLength; unCounter++) { nSum += r_poHASHKey->puchKey[unCounter]; } //return the sum calculated above mod r_poHASHTable->nHashTableSize //ensures that the returned index lies between zero and r_poHASHTable->nHashTableSize nHashTableIndex = (nSum % poHashTable->nHashTableSize); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Hash Table Index = %d\n", nHashTableIndex); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return nHashTableIndex; } //Universal Hash Function for String Keys unsigned int HashTable_Universal (void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey) { //t_AMPSContext* poAMPSContext = (t_AMPSContext*)r_pvAMPSContext; t_HASHTable* poHashTable = (t_HASHTable*)r_pvHASHTable; unsigned int nHashTableIndex = 0; int a = 31415; int b = 27183; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); for (nHashTableIndex = 0; nHashTableIndex < r_poHASHKey->unKeyLength; nHashTableIndex++, a = a*b % (poHashTable->nHashTableSize - 1)) { nHashTableIndex = (a*nHashTableIndex + r_poHASHKey->puchKey[nHashTableIndex]) % poHashTable->nHashTableSize; } //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Hash Table Index = %d\n", nHashTableIndex); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return nHashTableIndex; } #if !defined (HASH_Get16bits) #define HASH_Get16bits(cchKey) ((((unsigned int)(((const unsigned char *)(cchKey))[1])) << 8)\ +(unsigned int)(((const unsigned char *)(cchKey))[0]) ) #endif unsigned int HashTable_HashFunc1(void* r_pvAMPSContext, void* r_pvHASHTable, t_AMPSHashTableKey* r_poHASHKey) { t_HASHTable* poHashTable = r_pvHASHTable; unsigned int nHashTableIndex = r_poHASHKey->unKeyLength; unsigned int unKeyLength = r_poHASHKey->unKeyLength; const char* cchKey = (const char*)r_poHASHKey->puchKey; unsigned int unTemp = 0; int nReminder = 0; //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); nReminder = unKeyLength & 3; unKeyLength >>= 2; for ( ;unKeyLength > 0; unKeyLength--) { nHashTableIndex += HASH_Get16bits (cchKey); unTemp = (HASH_Get16bits (cchKey+2) << 11) ^ nHashTableIndex; nHashTableIndex = (nHashTableIndex << 16) ^ unTemp; cchKey += 2*sizeof(unsigned short); nHashTableIndex += nHashTableIndex >> 11; } switch (nReminder) { case 3: nHashTableIndex += HASH_Get16bits (cchKey); nHashTableIndex ^= nHashTableIndex << 16; nHashTableIndex ^= cchKey[sizeof (unsigned short)] << 18; nHashTableIndex += nHashTableIndex >> 11; break; case 2: nHashTableIndex += HASH_Get16bits (cchKey); nHashTableIndex ^= nHashTableIndex << 11; nHashTableIndex += nHashTableIndex >> 17; break; case 1: nHashTableIndex += *cchKey; nHashTableIndex ^= nHashTableIndex << 10; nHashTableIndex += nHashTableIndex >> 1; } nHashTableIndex ^= nHashTableIndex << 3; nHashTableIndex += nHashTableIndex >> 5; nHashTableIndex ^= nHashTableIndex << 4; nHashTableIndex += nHashTableIndex >> 17; nHashTableIndex ^= nHashTableIndex << 25; nHashTableIndex += nHashTableIndex >> 6; nHashTableIndex = (nHashTableIndex % poHashTable->nHashTableSize); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Hash Table Index = %d\n", nHashTableIndex); //TRACE( HASH_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return nHashTableIndex; }
相关文章推荐
- AMPS:Trace模块源码解读
- AMPS:单向链表源码解读
- AMPS:日志模块源码解读
- AMPS:内存管理模块源码解读(一)
- AMPS:双向链表源码解读
- AMPS:数据库访问模块源码解读
- AMPS:内存管理模块源码解读(二)
- AMPS:队列源码解读
- AMPS:MD5模块源码解读
- AMPS:堆源码解读
- AMPS:Cache模块源码解读
- AMPS:MySQL数据库操作模块源码解读
- AMPS:字符串操作源码解读
- AMPS:AES模块源码解读
- AMPS:Oracle数据库操作模块源码解读
- AMPS:定时器模块源码解读
- [Hadoop源码解读](一)MapReduce篇之InputFormat
- 第7课:Spark Streaming源码解读之JobScheduler内幕实现和深度思考
- [Hadoop源码解读](三)MapReduce篇之Job类
- 【转】SSD的caffe源码解读 -- 数据增强