回答
如果數據的性質被散列不需要任何花哨的哈希算法,如文本字符串的性質,你可能會想嘗試FNV hashing function。 FNV哈希是Fowler/Noll/Vo爲創作者所用的簡稱,是一種非常快速的算法,已在許多應用中用於精彩的結果,並且爲了簡單起見,FNV哈希應該是首次嘗試的哈希值之一一個應用程序。
unsigned int fnv_hash (void* key, int len)
{
unsigned char* p = key;
unsigned int h = 2166136261;
int i;
for (i = 0; i < len; i++)
h = (h*16777619)^p[i];
return h;
}
或滾動與MD5 algorithm代替,這是通用的,因此涵蓋您的需求相當不錯。
-1對於不必要的'void *'。 – Puppy 2012-07-10 13:42:19
@DeadMG爲什麼應該只爲文本專門設計一個散列函數呢?就其本質而言,它可以處理任何類型的數據,並且可以在沒有爲每個目的調整實現的情況下被重用。 – 2012-07-10 13:53:32
@DeadMG具有諷刺意味的是,就在你給我這個答案-1之前,我把你的答案upvoted在這裏http://stackoverflow.com/questions/3694899/c-template-and-inline-question它曾經有-1票在那之前。 – 2012-07-10 13:59:35
沒有通用的「最佳」哈希函數獨立於如何使用哈希。
讓我們假設你想要一個32位的int以便在內存中使用一個小的散列表。
然後你可以使用FNV-1a algorithm:
hash = offset_basis
for each octet_of_data to be hashed
hash = hash xor octet_of_data
hash = hash * FNV_prime
return hash
如果你的目的是有信心的事實,兩個路徑給出不同的哈希值,那麼你可以使用SHA1 algorithm。
如果你想確保它很難惡意創建衝突,那麼你可以使用SHA256。
請注意,那些最後2個算法會生成長哈希(比您的典型路徑更長)。
只需使用std::hash<std::string>
。這是您的圖書館實施者關於「最佳」通用非加密散列函數的想法。
- 1. 散列字符串的最佳算法
- 2. 混合數字和文字標識符的最佳散列函數
- 3. 字節爲字符串散列函數?
- 4. 良好的字符串散列函數
- 5. 字符串的散列函數
- 6. 字符串的通用散列函數
- 7. 什麼是十六進制字符串的最佳散列函數?
- 8. 字符串散列函數C
- 9. 雙向字符串散列函數
- 10. 字符串散列函數C
- 11. 用於cakephp散列函數的最大字符串長度
- 12. 在散列字符串中解決衝突的最佳方法
- 13. 對某些字符串不起作用的字符串的散列函數?
- 14. 字符串的散列碼
- 15. 整數散列函數與精度的字符串
- 16. 作爲散列函數鍵的字符串數組?
- 17. 具有最小衝突的短Python字母數字散列
- 18. 帶特殊字符的散列函數?
- 19. 散列字符的Emacs函數
- 20. PHP函數縮短文件目錄字符串
- 21. 從散列字符串中的子詞(和短語)
- 22. 如何提高短字符串的散列以避免衝突?
- 23. Python字符串列出最佳實踐
- 24. 檢測數據變化的最佳散列函數?
- 25. 幫助數字簽名散列(SHA1)字符串
- 26. 縮短路徑字符串函數
- 27. 字符串的最佳數據結構
- 28. 找到字符串中多個短語的最佳方法?
- 29. 爲(字符串)散列函數選擇乘數
- 30. 有沒有可以將字符串變成散列的函數?
哈希的目的是什麼?沒有通用的「最佳」散列函數,而與散列的使用方式無關。 – 2012-07-10 13:02:48
STL有一個內置的字符串哈希函數:http://en.cppreference.com/w/cpp/string/basic_string/hash – 2012-07-10 13:24:53