哈希(Hash)又稱散列,它是一個(gè)很常見的算法。在Java的HashMap數(shù)據(jù)結(jié)構(gòu)中主要就利用了哈希。哈希算法包括了哈希函數(shù)和哈希表兩部分。我們數(shù)組的特性可以知道,可以通過(guò)下標(biāo)快速(O(1))的定位元素,同理在哈希表中我們可以通過(guò)鍵(哈希值)快速的定位某個(gè)值,這個(gè)哈希值的計(jì)算就是通過(guò)哈希函數(shù)(hash(key) = address )計(jì)算得出的。通過(guò)哈希值即能定位元素[address] = value,原理同數(shù)組類似。
最好的哈希函數(shù)當(dāng)然是每個(gè)key值都能計(jì)算出唯一的哈希值,但往往可能存在不同的key值的哈希值,這就造成了沖突,評(píng)判一個(gè)哈希函數(shù)是否設(shè)計(jì)良好的兩個(gè)方面:
1.沖突少。
2.計(jì)算快。
下面給出幾種常用的哈希函數(shù),它們的背后都有一定的數(shù)學(xué)原理且經(jīng)過(guò)大量實(shí)踐,其數(shù)學(xué)原理不在這里探究?! ?/p>
BKDR哈希函數(shù)(h = 31 * h + c)
這個(gè)哈希函數(shù)被應(yīng)用在Java的字符串哈希值計(jì)算。
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式