VC CQHashNTBuffer 牛逼的Hash表 UINT32

  1 #pragma once
  2 
  3 #include "Afxmt.h"
  4 
  5 class CQHashNTNode 
  6 {
  7 public:
  8     CQHashNTNode()
  9     {
 10         m_nKeyData = 0;
 11         m_pValueData = NULL;
 12         m_nValueLength = 0;
 13         m_pNext = NULL;
 14         m_nValueSize = 0;
 15     }
 16     CQHashNTNode(UINT32 nKeyData)
 17     {
 18         m_nKeyData = nKeyData;
 19         m_pValueData = NULL;
 20         m_nValueLength = 0;
 21         m_pNext = NULL;
 22         m_nValueSize = 0;
 23     }
 24     CQHashNTNode(UINT32 nKeyData, PUINT8 pValueData, UINT32 nValueLength)
 25     {
 26         m_nKeyData = nKeyData;
 27         m_pValueData = NULL;
 28         m_nValueLength = 0;
 29         m_pNext = NULL;
 30         m_nValueSize = 0;    
 31         if (nValueLength > 0)
 32         {
 33             m_nValueSize = max(64, nValueLength + 32);
 34             m_pValueData = new UINT8[m_nValueSize];
 35             if (pValueData != NULL)
 36             {
 37                 memcpy(m_pValueData, pValueData, nValueLength);
 38                 m_nValueLength = nValueLength;
 39             }
 40         }
 41     }
 42     virtual ~CQHashNTNode()
 43     {
 44         if (m_pValueData != NULL)
 45         {
 46             delete[] m_pValueData;
 47             m_pValueData = NULL;
 48         }
 49     }
 50     
 51 public:
 52     VOID SetValue(PUINT8 pValueData, UINT32 nValueLength)
 53     {
 54         m_nValueLength = nValueLength;
 55         if (m_nValueSize <= nValueLength)
 56         {            
 57             m_nValueSize = max(64, nValueLength + 32);
 58             delete[] m_pValueData;
 59             m_pValueData = new UINT8[m_nValueSize];
 60         }
 61         if (pValueData != NULL)
 62         {
 63             memcpy(m_pValueData, pValueData, nValueLength);
 64         }
 65     }
 66     
 67     VOID SetValue(UINT32 nKeyData)
 68     {
 69         m_nKeyData = nKeyData;
 70     }
 71     
 72     VOID GetValue(PUINT8 & pValueData, UINT32 & nValueSize, UINT32 & nValueLength)
 73     {
 74         if (pValueData == NULL)
 75         {
 76             nValueSize = m_nValueLength + 32;
 77             pValueData = new UINT8[nValueSize];
 78         }
 79         if (nValueSize < m_nValueLength)
 80         {
 81             delete[] pValueData;
 82             pValueData = NULL;
 83             nValueSize = m_nValueLength + 32;
 84             pValueData = new UINT8[nValueSize];
 85         }
 86         memcpy(pValueData, m_pValueData, m_nValueLength);
 87         nValueLength = m_nValueLength;
 88     }
 89     
 90     VOID GetValue(UINT32 & nKeyData)
 91     {
 92         nKeyData = m_nKeyData;
 93     }
 94     
 95     
 96 public:
 97     VOID AddTailValue(UINT8 nValueByte)
 98     {
 99         if (m_pValueData == NULL)
100         {
101             m_nValueSize = 64;
102             m_pValueData = new UINT8[m_nValueSize]; 
103             m_nValueLength = 0;
104         }
105         else if (m_nValueLength >= m_nValueSize)
106         {
107             m_nValueSize = m_nValueLength + 64;
108             PUINT8 pBuffer = new UINT8[m_nValueSize]; 
109             memcpy(pBuffer, m_pValueData, m_nValueLength);
110             delete [] m_pValueData;
111             m_pValueData = pBuffer;
112         }
113         m_pValueData[m_nValueLength++] = nValueByte;
114     }
115     
116     
117 public:
118     BOOL EqualKey(UINT32 nKeyData)
119     {
120         return (nKeyData == m_nKeyData);
121     }
122 
123 public:
124     UINT32 GetHashCode()
125     {
126         return (m_nKeyData & 0x7fffffff);
127     }
128 
129 public:
130     static UINT32 GetHashCode(UINT32 nKeyData)
131     {
132         return (nKeyData & 0x7fffffff);
133     }
134 
135 public:
136     UINT32 m_nKeyData;
137     PUINT8 m_pValueData;
138     UINT32 m_nValueLength;
139     CQHashNTNode * m_pNext;
140 
141 public:
142     UINT32 m_nValueSize;
143 };
144 
145 typedef CQHashNTNode* CQHashNTNodePtr;
146 
147 class CQHashNTBuffer 
148 {
149 private:
150     CQHashNTNodePtr * m_pHashTable;
151     UINT32 m_nTableSize;
152     UINT32 m_nNodeCount;
153     UINT32 m_nCurrentIndex;
154     CQHashNTNode * m_pCurrentNode;
155 
156 public:
157     CQHashNTBuffer()
158     {
159         m_nNodeCount = 0;
160         m_nTableSize = 0;
161         m_pHashTable = NULL;
162     }
163     CQHashNTBuffer(UINT32 nHashSize)
164     {
165         m_nNodeCount = 0;
166         m_nTableSize = nHashSize;
167         m_pHashTable = new CQHashNTNodePtr[nHashSize]();
168         for (int x = 0; x < nHashSize; x++)
169         {
170             m_pHashTable[x] = NULL;
171         }
172     }
173     virtual ~CQHashNTBuffer()
174     {
175         CQHashNTNode *pNode = NULL;
176         CQHashNTNode *pTemp = NULL;
177         for (int x = 0; x < m_nTableSize; x++)
178         {
179             pNode = m_pHashTable[x];
180             while (pNode)
181             {
182                 pTemp = pNode;
183                 pNode = pNode->m_pNext;
184                 delete pTemp;
185             }
186         }
187         delete[] m_pHashTable;
188     }
189 
190 public:
191     BOOL Lookup(UINT32 nKeyData, PUINT8 & pValueData, UINT32 & nValueSize, UINT32 & nValueLength)
192     {
193         BOOL bResult = FALSE;
194         UINT32 nIndex = CQHashNTNode::GetHashCode(nKeyData) % m_nTableSize;
195         if (m_pHashTable[nIndex] != NULL)
196         {
197             CQHashNTNode * pNode = m_pHashTable[nIndex];
198             while (pNode)
199             {
200                 if (pNode->EqualKey(nKeyData))
201                 {
202                     pNode->GetValue(pValueData, nValueSize, nValueLength);
203                     bResult = TRUE;
204                     break;
205                 }
206                 pNode = pNode->m_pNext;
207             }
208         }
209         return bResult;
210     }
211     BOOL Lookup(UINT32 nKeyData, CQHashNTNode * pValueData)
212     {
213         BOOL bResult = FALSE;
214         UINT32 nIndex = CQHashNTNode::GetHashCode(nKeyData) % m_nTableSize;
215         if (m_pHashTable[nIndex] != NULL)
216         {
217             CQHashNTNode * pNode = m_pHashTable[nIndex];
218             while (pNode)
219             {
220                 if (pNode->EqualKey(nKeyData))
221                 {
222                     pNode->GetValue(pValueData->m_pValueData, pValueData->m_nValueSize, pValueData->m_nValueLength);
223                     bResult = TRUE;
224                     break;
225                 }
226                 pNode = pNode->m_pNext;
227             }
228         }
229         return bResult;
230     }
231     BOOL Contains(UINT32 nKeyData) 
232     {
233         BOOL bResult = FALSE;
234         UINT32 nIndex = CQHashNTNode::GetHashCode(nKeyData) % m_nTableSize;
235         if (m_pHashTable[nIndex] != NULL)
236         {
237             CQHashNTNode * pNode = m_pHashTable[nIndex];
238             while (pNode)
239             {
240                 if (pNode->EqualKey(nKeyData))
241                 {
242                     bResult = TRUE;
243                     break;
244                 }
245                 pNode = pNode->m_pNext;
246             }
247         }
248         return bResult;
249     }
250     VOID SetAt(UINT32 nKeyData, PUINT8 pValueData, UINT32 nValueLength)
251     {
252         UINT32 nIndex = CQHashNTNode::GetHashCode(nKeyData) % m_nTableSize;
253         if (m_pHashTable[nIndex] != NULL)
254         {            
255             BOOL bFind = FALSE;
256             CQHashNTNode * pNode = m_pHashTable[nIndex];
257             while (pNode)
258             {
259                 if (pNode->EqualKey(nKeyData))
260                 {
261                     pNode->SetValue(pValueData, nValueLength);
262                     bFind = TRUE;
263                     break;
264                 }
265                 pNode = pNode->m_pNext;
266             }
267             if (!bFind)
268             {
269                 pNode = new CQHashNTNode(nKeyData, pValueData, nValueLength);
270                 pNode->m_pNext = m_pHashTable[nIndex];
271                 m_pHashTable[nIndex] = pNode;
272                 m_nNodeCount += 1;
273             }
274         }
275         else
276         {
277             CQHashNTNode * pNode = new CQHashNTNode(nKeyData, pValueData, nValueLength);
278             pNode->m_pNext = m_pHashTable[nIndex];
279             m_pHashTable[nIndex] = pNode;
280             m_nNodeCount += 1;
281         }
282     }
283     VOID Remove(UINT32 nKeyData)
284     {
285         UINT32 nIndex = CQHashNTNode::GetHashCode(nKeyData) % m_nTableSize;
286         if (m_pHashTable[nIndex] != NULL)
287         {
288             CQHashNTNode * pNode = m_pHashTable[nIndex];
289             CQHashNTNode * pPrev = NULL;
290             while (pNode != NULL)
291             {
292                 if (pNode->EqualKey(nKeyData))
293                 {
294                     if (pPrev == NULL)
295                     {
296                         m_pHashTable[nIndex] = pNode->m_pNext;
297                     }
298                     else 
299                     {
300                         pPrev->m_pNext = pNode->m_pNext;
301                     }
302                     delete pNode;
303                     m_nNodeCount -= 1;
304                     break;
305                 }
306                 pNode = pNode->m_pNext;
307             }
308         }
309     }
310     VOID RemoveAll()
311     {
312         for (UINT32 n = 0; n < m_nTableSize; n++)
313         {
314             if (m_pHashTable[n] != NULL)
315             {
316                 CQHashNTNode * pNode = m_pHashTable[n];
317                 while (pNode)
318                 {
319                     m_pHashTable[n] = pNode->m_pNext;
320                     delete pNode;
321                     pNode = m_pHashTable[n];
322                 }
323             }
324         }
325         m_nNodeCount = 0;
326     }
327     UINT32 GetCount()
328     {
329         return m_nNodeCount;
330     }
331 public:
332     CQHashNTNode * GetHead()
333     {
334         m_nCurrentIndex = 0;
335         m_pCurrentNode = NULL;
336         for (UINT32 n = 0; n < m_nTableSize; n++)
337         {
338             if (m_pHashTable[n] != NULL)
339             {
340                 m_nCurrentIndex = n;
341                 m_pCurrentNode = m_pHashTable[n];
342                 break;
343             }
344         }
345         return m_pCurrentNode;
346     }
347     CQHashNTNode * GetNext()
348     {
349         if (m_pCurrentNode != NULL)
350         {
351             if (m_pCurrentNode->m_pNext != NULL)
352             {
353                 m_pCurrentNode = m_pCurrentNode->m_pNext;
354             }
355             else 
356             {
357                 for (UINT32 n = m_nCurrentIndex; n < m_nTableSize; n++)
358                 {
359                     if (m_pHashTable[n] != NULL)
360                     {
361                         m_nCurrentIndex = n;
362                         m_pCurrentNode = m_pHashTable[n];
363                         break;
364                     }
365                 }
366             }
367         }
368         return m_pCurrentNode;
369     }
370 };
原文地址:https://www.cnblogs.com/lizhi0755/p/9593302.html