最近做了乙個dns日誌解析的專案,需要對字串進行大量查詢,對效率要求比較高,所以在網上找了很多關於雜湊的資料,
在網上找了乙個演算法如下:
inline static unsigned int hash_func(char *str, int len)
return ((sum << 16) | h) % max_prime_less_than_hash_len;
}上面這個演算法看上去好像是沒什麼問題,其實這個演算法是有問題的,我測試發現,對同乙個字串比如 "othercityimg02.taobaocdn.com" 每次雜湊的結果不一定一樣,
主要是 register unsigned short *p = (unsigned short *)str;
register unsigned short *s = (unsigned short *)str;
導致的,這樣p++一次其實是跳了兩個字元,所以我做了如下改進:
inline static unsigned int hash_func(char *str, int len)
return ((sum << 16) | h) % max_prime_less_than_hash_len;
}現在每次對同乙個字串雜湊結果都是一樣的了。好,收工!
字串 字串雜湊hash演算法
以洛谷p3370為引子引入吧 雜湊其實是所有字串操作中,筆者認為最簡單的操作了 except輸入輸出qwq 雜湊的過程,其實可以看作對乙個串的單向加密過程,並且需要保證所加的密不能高概率重複 就像不能讓隔壁老王輕易地用它家的鑰匙開啟你家門一樣qwq 通過這種方式來替代一些很費時間的操作。比如,最常見...
字串雜湊 Hash
字串雜湊,用通俗點的說法就是將乙個字串轉換成乙個整數,而且用雜湊轉換出來的整數,不同的字串,不出意外整數也不一樣 存在極少的情況一樣 從而更方便地確定某個字串是否重複出現過或者對字串進行其他的判斷。基本思想 假設乙個字串 abcdabcd 將整個字串看成乙個p p一般取131或者13331比較好,可...
Hash 字串 字串雜湊
luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...