哈稀函數按照定義可以實現一個偽隨機數生成器(PRNG),從這個角度可以得到一個公認的結論:哈希函數之間性能的比較可以通過比較其在偽隨機生成方面的比較來衡量。
一般來說,對任意一類的數據存在一個理論上完美的哈希函數。這個完美的哈希函數定義是沒有發生任何碰撞,這意味着沒有出現重復的散列值。在現實中它很難找到一個完美的哈希散列函數,而且這種完美函數的趨近變種在實際應用中的作用是相當有限的。在實踐中人們普遍認識到,一個完美哈希的哈希函數,就是在一個特定的數據集上產生的的碰撞最少哈希的函數。
我們所能做的就是通過試錯方法來找到滿足我們要求的哈希函數。可以從下面兩個角度來選擇哈希函數:
1.數據分布
一個衡量的措施是考慮一個哈希函數是否能將一組數據的哈希值進行很好的分布。要進行這種分析,需要知道碰撞的哈希值的個數,如果用鏈表來處理碰撞,則可以分析鏈表的平均長度,也可以分析散列值的分組數目。
2.哈希函數的效率
另個一個衡量的標准是哈希函數得到哈希值的效率。通常,包含哈希函數的算法的算法復雜度都假設為O(1),這就是為什么在哈希表中搜索數據的時間復雜度會被認為是"平均為O(1)的復雜度",而在另外一些常用的數據結構,比如圖(通常被實現為紅黑樹),則被認為是O(logn)的復雜度。
一個好的哈希函數必須在理論上非常的快、穩定並且是可確定的。通常哈希函數不可能達到O(1)的復雜度,但是哈希函數在字符串哈希的線性的搜索中確實是非常快的,並且通常哈希函數的對象是較小的主鍵標識符,這樣整個過程應該是非常快的,並且在某種程度上是穩定的。
在這篇文章中介紹的哈希函數被稱為簡單的哈希函數。它們通常用於散列(哈希字符串)數據。它們被用來產生一種在諸如哈希表的關聯容器使用的key。這些哈希函數不是密碼安全的,很容易通過顛倒和組合不同數據的方式產生完全相同的哈希值。
https://www.cnblogs.com/youngerchina/p/5624453.html