(13)字符串哈希

来源:互联网 发布:51单片机c语言教程全集 编辑:程序博客网 时间:2024/06/05 13:25
#include <iostream>#include <string>using namespace std;void TestReverseIndex();const unsigned HASH_SIZE = 1024;const unsigned CRYPT_SIZE = 0x100;// 索引节点struct KeyNode{string strKey;int count;int pos;struct KeyNode *pNext;};KeyNode *hash_table[HASH_SIZE];struct DocNode{string docID;int classOne;string classTwo;string time;string MD5;int weight;struct DocNode * pNext;};unsigned long cryptTable[CRYPT_SIZE];// 构造cryptTablevoid PrepareCryptTable();// 返回字符串的hash值unsigned long HashString(const char *lpszkeyName, unsigned long dwHashType);// 在hash表中寻找关键字,如何找到,则返回hash节点KeyNode * SearchByString(const char * lpszkeyName);

#include "13_ReverseIndex.h"void TestReverseIndex(){}void PrepareCryptTable(){unsigned long seed = 0x00100001;unsigned long index1, index2, i;for (index1 = 0; index1 < 0x001; ++index1){for (index2 = index1, i = 0; i < 5; i++, index2 += 0x100){unsigned long temp1, temp2;seed = (seed * 125 + 3) % 0x2AAAAB;temp1 = (seed & 0xFFFF) << 0x10;seed = (seed * 125 + 3) % 0x2AAAAB;temp2 = (seed % 0xFFFF);cryptTable[index2] = (temp1 | temp2);}}}unsigned long HashString(const char *lpszkeyName, unsigned long dwHashType){unsigned char *key = (unsigned char *)lpszkeyName;unsigned long seed1 = 0x7FED7FED;unsigned long seed2 = 0xEEEEEEEE;int ch;while (*key != 0){ch = *key++;seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;}return seed1;}KeyNode * SearchByString(const char * lpszkeyName){const int HASH_OFFSET = 0, HASH_C = 1, HASH_D = 2;unsigned int nHash = HashString(lpszkeyName, HASH_OFFSET);unsigned int nHashC = HashString(lpszkeyName, HASH_C);unsigned int nHashD = HashString(lpszkeyName, HASH_D);unsigned int nHashStart = nHash % HASH_SIZE;unsigned int nHashPos = nHashStart;}


原创粉丝点击