<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      書山有徑勤為路>>>>>>>>

      <<<<<<<<學海無涯苦作舟!

      Hash算法——暴雪

      暴雪公司有個經典的字符串的hash公式  
      先提一個簡單的問題,假如有一個龐大的字符串數組,然后給你一個單獨的字符串,讓你從這個數組中查找是否有這個字符串并找到它,你會怎么做?  
      有一個方法最簡單,老老實實從頭查到尾,一個一個比較,直到找到為止,我想只要學過程序設計的人都能把這樣一個程序作出來,但要是有程序員把這樣的程序交給用戶,我只能用無語來評價,或許它真的能工作,但也只能如此了。  
      最合適的算法自然是使用HashTable(哈希表),先介紹介紹其中的基本知識,所謂Hash,一般是一個整數,通過某種算法,可以把一個字符串
      "壓縮" 成一個整數,這個數稱為Hash,當然,無論如何,一個32位整數是無法對應回一個字符串的,但在程序中,兩個字符串計算出的Hash值相等的可能非常小,下面看看在MPQ中的Hash算法  
      unsigned 
      long HashString(char *lpszFileName, unsigned long dwHashType)  
      {  
      unsigned 
      char *key = (unsigned char *)lpszFileName;  
      unsigned 
      long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;  
      int ch;  
      while(*key != 0)  
      {  
      ch 
      = toupper(*key );  
      seed1 
      = cryptTable[(dwHashType < < 8) ch] ^ (seed1 seed2);  
      seed2 
      = ch seed1 seed2 (seed2 < < 53;  
      }  
      return seed1;  
      }  
      Blizzard的這個算法是非常高效的,被稱為
      "One-Way Hash",舉個例子,字符串"unitneutralacritter.grp"通過這個算法得到的結果是0xA26067F3。  
      是不是把第一個算法改進一下,改成逐個比較字符串的Hash值就可以了呢,答案是,遠遠不夠,要想得到最快的算法,就不能進行逐個的比較,通常是構造一個哈希表(Hash Table)來解決問題,哈希表是一個大數組,這個數組的容量根據程序的要求來定義,例如1024,每一個Hash值通過取模運算 (mod)對應到數組中的一個位置,這樣,只要比較這個字符串的哈希值對應的位置又沒有被占用,就可以得到最后的結果了,想想這是什么速度?是的,是最快的O(
      1),現在仔細看看這個算法吧  
      int GetHashTablePos(char *lpszString, SOMESTRUCTURE *lpTable, int nTableSize)  
      {  
      int nHash = HashString(lpszString), nHashPos = nHash % nTableSize;  
      if (lpTable[nHashPos].bExists && !strcmp(lpTable[nHashPos].pString, lpszString))  
      return nHashPos;  
      else  
      return -1//Error value  
      }  
      看到此,我想大家都在想一個很嚴重的問題:
      "假如兩個字符串在哈希表中對應的位置相同怎么辦?",究竟一個數組容量是有限的,這種可能性很大。解決該問題的方法很多,我首先想到的就是用"鏈表",感謝大學里學的數據結構教會了這個百試百靈的法寶,我碰到的很多算法都可以轉化成鏈表來解決,只要在哈希表的每個入口掛一個鏈表,保存所有對應的字符串就OK了。  
      事情到此似乎有了完美的結局,假如是把問題獨自交給我解決,此時我可能就要開始定義數據結構然后寫代碼了。然而Blizzard的程序員使用的方法則是更精妙的方法。基本原理就是:他們在哈希表中不是用一個哈希值而是用三個哈希值來校驗字符串。  
      中國有句古話
      "再一再二不能再三再四",看來Blizzard也深得此話的精髓,假如說兩個不同的字符串經過一個哈希算法得到的入口點一致有可能,但用三個不同的哈希算法算出的入口點都一致,那幾乎可以肯定是不可能的事了,這個幾率是1:18889465931478580854784,大概是10的 22.3次方分之一,對一個游戲程序來說足夠安全了。  
      現在再回到數據結構上,Blizzard使用的哈希表沒有使用鏈表,而采用
      "順延"的方式來解決問題,看看這個算法:  
      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, nHashPos = nHashStart;  
      while (lpTable[nHashPos].bExists)  
      {  
      if (lpTable[nHashPos].nHashA == nHashA && lpTable[nHashPos].nHashB == nHashB)  
      return nHashPos;  
      else  
      nHashPos 
      = (nHashPos 1% nTableSize;  
      if (nHashPos == nHashStart)  
      break;  
      }  
      return -1//Error value  
      }  
      1. 計算出字符串的三個哈希值(一個用來確定位置,另外兩個用來校驗)  
      2. 察看哈希表中的這個位置  
      3. 哈希表中這個位置為空嗎?假如為空,則肯定該字符串不存在,返回  
      4. 假如存在,則檢查其他兩個哈希值是否也匹配,假如匹配,則表示找到了該字符串,返回  
      5. 移到下一個位置,假如已經越界,則表示沒有找到,返回  
      6. 看看是不是又回到了原來的位置,假如是,則返回沒找到  
      7. 回到3  
      怎么樣,很簡單的算法吧,但確實是天才的idea, 其實最優秀的算法往往是簡單有效的算法。

      posted on 2011-09-25 10:30  More study needed.  閱讀(538)  評論(0)    收藏  舉報

      導航

      書山有徑勤為路>>>>>>>>

      <<<<<<<<學海無涯苦作舟!

      主站蜘蛛池模板: 久久国产成人亚洲精品影院老金| 久久精品国产99国产精品澳门| 日韩精品国产中文字幕| 亚洲 一区二区 在线| 亚洲春色在线视频| 色综合色国产热无码一| 亚洲精品一区二区三区小| 美女扒开奶罩露出奶头视频网站| 国产精品一区二区插插插| 亚洲精品麻豆一二三区| 97久久综合亚洲色hezyo| 日本亚洲一区二区精品久久| 亚洲另类无码一区二区三区| 国产精品中文一区二区| 强奷乱码中文字幕| 视频一区二区 国产视频| 军事| 国产成人午夜福利在线播放| 久久精品国产一区二区三 | 国产一区二区三区美女| 亚洲精品美女久久7777777| 久热久视频免费在线观看| 欧美高清狂热视频60一70| 中文字幕无码不卡免费视频| 熟女亚洲综合精品伊人久久| 无码帝国www无码专区色综合| 久久―日本道色综合久久| 中国熟女仑乱hd| 黄色A级国产免费大片视频| 日韩午夜无码精品试看| 亚洲精品久久一区二区三区四区| 亚洲顶级裸体av片| 西乌珠穆沁旗| 亚洲精品宾馆在线精品酒店| 天堂网在线.www天堂在线资源| 国产亚洲精品2021自在线| 欧美人禽zozo动人物杂交| 亚洲加勒比久久88色综合| 国产日韩综合av在线| 国产无码高清视频不卡| 制服jk白丝h无内视频网站|