#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];
// 构造cryptTable
void 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;
}