我有一長串英文單詞,我想散列它們。什麼是一個好的散列函數?到目前爲止,我的哈希函數將這些字母的ASCII值相加,然後對錶格大小進行取模。我正在尋找一些高效和簡單的東西。什麼是英語單詞的好散列函數?
回答
簡單地總結這些字母並不是一個好的策略,因爲排列給出了相同的結果。
這一個(djb2)是相當流行,並與ASCII字符串很好地工作。
unsigned long hashstring(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
如果您需要更多替代方案和一些性能指標,請閱讀here。
補充:這是一般散列函數,其中輸入域事先不知道(也許除了一些很一般的假設:如上述作品稍好ASCII碼輸入),這是最常用的場景。如果你有一個已知的限制域(固定輸入集),你可以做得更好,見Fionn的答案。
也許這樣的事情會幫助你:http://www.gnu.org/s/gperf/
它產生的輸入域優化的散列函數。
如果你不需要它是密碼安全的,我會建議Murmur哈希。它速度極快,擴散性高。使用方便。
http://en.wikipedia.org/wiki/MurmurHash
http://code.google.com/p/smhasher/wiki/MurmurHash3
如果你確實需要一個加密的安全散列,那麼我建議通過OpenSSL的SHA1。
MurmurHash +1,do你知道CityHash和MurmurHash之間的比較嗎?我已經聽到了有關兩者的好消息,但從來沒有看到過全面的比較,只是有一些奇怪的事實。 –
晚了一點,但這裏是一個非常低的碰撞率低於64位版本的散列函數,並〜差不多〜好了32位版本:
uint64_t slash_hash(const char *s)
//uint32_t slash_hash(const char *s)
{
union { uint64_t h; uint8_t u[8]; };
int i=0; h=strlen(s);
while (*s) { u[i%8] += *s + i + (*s >> ((h/(i+1)) % 5)); s++; i++; }
return h; //64-bit
//return (h+(h>>32)); //32-bit
}
哈希數字在整個可能的範圍內也非常均勻地分佈,沒有可檢測到的聚集 - 這是使用隨機字符串進行檢查的。
還測試了從本地文本文件中提取的單詞與LibreOffice詞典/同義詞詞彙(英語和法語 - 超過97000個單詞和結構)結合在64位中發生0次碰撞,並在32位中發生1次碰撞: )
(還與FNV1A_Hash_Yorikke,djb2和MurmurHash2在同一組進行比較:Yorikke & djb2沒有做好; slash_hash在所有的測試中稍微好一點確實比MurmurHash2)
這是一個合理的散列函數。我建議避免未命名的聯盟。 - >>'union {uint64_t h; uint8_t u [8]; } uu;'和代碼中的類似變化 - >> uu.h = strlen(s);'...'uu.u [i%8] + = ...'etc – joop
- 1. 什麼是散列函數?
- 2. 什麼散列函數更好?
- 3. 什麼是一個整數元組的好散列函數?
- 4. 什麼是創建可逆散列的好方法/函數?
- 5. 單詞之間相似度最好的WordNet函數是什麼?
- 6. 張量散列函數是什麼?
- 7. 簡單英語中的JavaBeans是什麼?
- 8. 爲什麼給定的散列函數是一個糟糕的散列函數?
- 9. 檢查單詞是否是英語Python
- 10. 列車數據的同義詞單詞英語與opennlp
- 11. PyEnchant:用英語單詞替換互聯網友好的詞
- 12. 在線詞典的英語單詞MySQL
- 13. 自然英語單詞
- 14. 英語「停止詞」列表?
- 15. 爲什麼CurrentUICulture.DisplayName說「英語(美國)」而不是「英語(英國)」?
- 16. 什麼是用簡單英語解釋的參數化查詢?
- 17. C++,什麼是散列數組的好方法?
- 18. Python:查找列表中的某些單詞是實際英文單詞還是接近英文單詞
- 19. 什麼是使用數學函數的好的庫/語言
- 20. Vertica使用什麼散列函數
- 21. 如何檢查單詞是日語還是英語?
- 22. 「pan domain name」的英文單詞是什麼?
- 23. 什麼是單身人士,用簡單的英語?
- 24. 如何檢查單詞是日語或英語的使用PHP
- 25. @XToX註釋字段的主要術語(最好是單詞)是什麼?
- 26. C++上的散列函數很好unordered_set
- 27. 良好的字符串散列函數
- 28. 刪除python中的非英語單詞
- 29. 如果函數中的語句什麼是最好的方法
- 30. 「散列函數的分佈」是什麼意思?
入住這裏的http://www.cse。 yorku.ca/~oz/hash.html –
可能的重複[良好的字符串哈希函數](https://stackoverflow.com/questions/2624192/good-hash-function-for-strings)和[什麼是好東西Java中的64位散列函數用於文本字符串?](https://stackoverflow.com/questions/1660501/what-is-a-good-64bit-hash-function-in-java-for-textual-strings) –