壹個優秀的 hash 算法,將能實現:
但在不同的使用場景中,如數據結構和安全領域裏,其中對某壹些特點會有所側重。
以HashMap為例,key(hash值)對應壹個(或多個數據),key的作用是,對於抗碰撞的要求沒有那麽高。換句話說,hash出來的key,只要保證value大致均勻的放在不同的桶裏就可以了。但整個算法的set性能,直接與hash值產生的速度有關,所以這時候的hash值的產生速度就尤為重要,如JDK中的String.hashCode():
在密碼學中,hash算法的作用主要是用於消息摘要和簽名,對整個消息的完整性進行校驗。這對於抗碰撞和抗篡改能力要求極高,對速度的要求在其次。以MD5為例,其輸出長度為128位,設計預期碰撞概率為1/(2^128),這是壹個極小極小的數字.
目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。
可以看出,上面這幾種流行的算法,它們最重要的壹點區別就是”強抗碰撞性”。