AMPS:哈希表源码解读

来源:互联网 发布:卖淘宝号平台 编辑:程序博客网 时间:2024/06/06 00:41

  Hash表也是一种常用的数据结构,AMPS中的Hash表并不是给使用者提供一个散列函数,而是仅提供一个创建和维护Hash表这样一个结构的一组函数,针对不同的应用或者数据,由用户自己定义其要使用的散列函数,AMPS中,Hash表组成结构是如下的拉链式结构。


下面看看AMPS中对Hash操作的代码:

AMPS_Hash.h

#ifndef __HEADER_AMPS_HASH_H#define __HEADER_AMPS_HASH_H#ifdef __cplusplusextern "C" {#endif#include "AMPS_API.h"#include "AMPS_Defines.h"#include "AMPS_LinkList.h"//#define AMPS_HASH_TABLE_KEY_SIZE1009    // Prime Nos : 1009, 11003, 11027, 50021, 50023, 100019typedef 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_AMPSHashTableKeyoHASHKey;    intnHashTableIndex;    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_HashTableProcessNodeDataCallbackpfAMPS_HashTableProcessNodeDataCallback;AMPS_APP_HANDLEhAMPS_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 keysunsigned 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 Keysunsigned 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]) )#endifunsigned 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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买的新鞋子臭脚怎么办 鞋子臭脚怎么办如何除 惠普803墨盒干了怎么办 酷派手机无命令怎么办 华为手机锁机了怎么办 小孩被蜘蛛咬了怎么办 我是一个不爱说话的人怎么办 光动能手表停了怎么办 电波表收不到波怎么办 吃了壮阳药头疼怎么办 吃了伟哥后头痛怎么办 伟哥吃了不管用怎么办 钱站的钱还不起怎么办 面试工资要低了怎么办 线切割环保来查怎么办 喝白酒咽不下去怎么办 翠佛堂的玉假了怎么办 300英雄账号忘了怎么办 买了假酒不承认怎么办 买到假酒不承认怎么办 喝假酒胃里难受怎么办 怀孕初期塞药了怎么办 促黄体生成素高怎么办 激素脸痒的厉害怎么办 肾阴虚又肾阳虚怎么办 泡菜坛子太酸了怎么办 吃花粉过敏休刻怎么办 脸过敏怎么办才最有效 喝花粉后过敏了怎么办 阿比特龙耐药后怎么办 马蜂把人蜇了怎么办 非那雄胺副作用怎么办 来电充电宝丢了怎么办 蜂哈哈过量伤子怎么办 八个月宝宝伤食怎么办 床有虫子咬木板怎么办 床的木板有蛀虫怎么办 中蜂发生盗蜂了怎么办 中蜂发生盗蜂怎么办 孕妇给黄蜂蛰了怎么办 被葫芦蜂蜇了怎么办