亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

字符串的哈希函數

字符串的哈希函數

12345678_0001 2019-07-23 19:07:00
字符串的哈希函數我正在使用C語言編寫哈希表,我正在測試字符串的哈希函數。我嘗試過的第一個函數是添加ascii代碼并使用modulo(%100)但是我在第一次數據測試時得到的結果很差:140個單詞的40個沖突。最終的輸入數據將包含8 000個單詞(它是一個文件中的dictionnary存儲)。哈希表聲明為int table [10000]并包含txt文件中單詞的位置。第一個問題是哪個是散列字符串的最佳算法?以及如何確定哈希表的大?。刻崆爸轮x !
查看完整描述

3 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

首先,您通常希望對哈希表使用加密哈希。根據哈希表標準,加密標準非常快的算法仍然非常慢。

其次,您希望確保輸入的每一位都能/將影響結果。一種簡單的方法是將當前結果旋轉一些位,然后用當前字節對當前哈希碼進行異或。重復,直到到達字符串的末尾。請注意,您通常希望旋轉為字節大小的偶數倍。

例如,假設8位字節的常見情況,您可以旋轉5位:

int hash(char const *input) { 
    int result = 0x55555555;

    while (*input) { 
        result ^= *input++;
        result = rol(result, 5);
    }}

編輯:另請注意,10000個插槽很少是哈希表大小的好選擇。您通常需要以下兩種方法之一:您要么使用素數作為大小(需要確保某些類型的散列分辨率的正確性),要么需要2的冪(因此可以通過簡單的方法將值減小到正確的范圍位掩碼)。


查看完整回答
反對 回復 2019-07-23
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

對于C,存在許多現有的哈希表實現,從C標準庫hcreate / hdestroy / hsearch到APRglib中的那些,它們還提供預構建的哈希函數。我強烈建議使用它們,而不是發明自己的哈希表或哈希函數; 它們已針對常見用例進行了大量優化。

但是,如果您的數據集是靜態的,那么您最好的解決方案可能是使用完美的哈希。對于給定的數據集,gperf將為您生成完美的哈希值。


查看完整回答
反對 回復 2019-07-23
  • 3 回答
  • 0 關注
  • 703 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號