日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mpq算法实现哈希查找

發布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mpq算法实现哈希查找 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用特定的轉化規則,將字符串轉成進制數用一定規則存放。
實現哈希查找

#include <stdio.h> #include <ctype.h> //多謝citylove指正。typedef struct { int nHashA; int nHashB; int bExists ;//是否沖突 }MPQHASHTABLE; int nTableSize=40000000; //crytTable[]里面保存的是HashString函數里面將會用到的一些數據,在prepareCryptTable //函數里面初始化 unsigned long cryptTable[0x500];//以下的函數生成一個長度為0x500(合10進制數:1280)的cryptTable[0x500] void prepareCryptTable() {unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;for( index1 = 0; index1 < 0x100; 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 );}} }//以下函數計算lpszFileName 字符串的hash值,其中dwHashType 為hash的類型, //在下面GetHashTablePos函數里面調用本函數,其可以取的值為0、1、2;該函數 //返回lpszFileName 字符串的hash值; unsigned long HashString( char *lpszFileName, unsigned long dwHashType ) {unsigned char *key = (unsigned char *)lpszFileName; unsigned long seed1 = 0x7FED7FED; unsigned long seed2 = 0xEEEEEEEE;int ch;while( *key != 0 ){ch = toupper(*key++);seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;}return seed1; }void initHashTable(MPQHASHTABLE *lpTable,int size) {int i;lpTable=(MPQHASHTABLE *)malloc(sizeof(MPQHASHTABLE)*size);for( i=0;i<size;i++){lpTable->bExists=0;//不沖突lpTable->nHashA=0;lpTable->nHashB=0;} } void insertHashTable(MPQHASHTABLE *lpTable,char * lpszString) {const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;int nHash = HashString(lpszString, HASH_OFFSET);int nHashA = HashString(lpszString, HASH_A);int nHashB = HashString(lpszString, HASH_B);int nHashStart = nHash % nTableSize;int nHashPos = nHashStart;while ( lpTable[nHashPos].bExists!=1 ){/* 如果僅僅是判斷在該表中時候存在這個字符串,就比較這兩個hash值就可以了,不用對結構體中的字符串進行比較。這樣會加快運行的速度?減少hash表占用的空間?這種 方法一般應用在什么場合?*/nHashPos = (nHashPos + 1) % nTableSize;}lpTable[nHashPos].nHashA =nHashA;lpTable[nHashPos].nHashB = nHashB ;} int GetHashTablePos( char *lpszString, MPQHASHTABLE *lpTable, int nTableSize ) {const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;int nHash = HashString(lpszString, HASH_OFFSET);int nHashA = HashString(lpszString, HASH_A);int nHashB = HashString(lpszString, HASH_B);int nHashStart = nHash % nTableSize;int nHashPos = nHashStart;while ( lpTable[nHashPos].bExists ){/* 如果僅僅是判斷在該表中時候存在這個字符串,就比較這兩個hash值就可以了,不用對結構體中的字符串進行比較。這樣會加快運行的速度?減少hash表占用的空間?這種 方法一般應用在什么場合?*/if (lpTable[nHashPos].nHashA == nHashA&& lpTable[nHashPos].nHashB == nHashB ){return nHashPos;}else{nHashPos = (nHashPos + 1) % nTableSize;}if (nHashPos == nHashStart) break;}return -1; } int main() {//char *A={"jttqzh","kwztsgxx","ilovestudy"};MPQHASHTABLE *l;initHashTable(l,nTableSize);insertHashTable(l,"niceday");insertHashTable(l,"studyday");insertHashTable(l,"library");printf("%d\nf",GetHashTablePos("niceday",l,nTableSize)); }

總結

以上是生活随笔為你收集整理的mpq算法实现哈希查找的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。