HashMap是對(duì)數(shù)據(jù)結(jié)構(gòu)中哈希表(Hash

創(chuàng)新互聯(lián)公司是一家從事企業(yè)網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、行業(yè)門(mén)戶網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)制作的專(zhuān)業(yè)網(wǎng)站建設(shè)公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁(yè)設(shè)計(jì)人員,具備各種規(guī)模與類(lèi)型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹(shù)立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來(lái)曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)上千多家。
Table)的實(shí)現(xiàn),Hash表又叫散列表。Hash表是根據(jù)關(guān)鍵碼Key來(lái)訪問(wèn)其對(duì)應(yīng)的值Value的數(shù)據(jù)結(jié)構(gòu),它通過(guò)一個(gè)映射函數(shù)把關(guān)鍵碼映射到表中一個(gè)位置來(lái)訪問(wèn)該位置的值,從而加快查找的速度。這個(gè)映射函數(shù)叫做Hash函數(shù),存放記錄的數(shù)組叫做Hash表。
在Java中,HashMap的內(nèi)部實(shí)現(xiàn)結(jié)合了鏈表和數(shù)組的優(yōu)勢(shì),鏈接節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)是Entry
,每個(gè)Entry對(duì)象的內(nèi)部又含有指向下一個(gè)Entry類(lèi)型對(duì)象的引用,如以下代碼所示:
static
class
Entry
implements
Map.Entry
{
final
K
key;
V
value;
Entry
next;
//Entry類(lèi)型內(nèi)部有一個(gè)自己類(lèi)型的引用,指向下一個(gè)Entry
final
int
hash;
...
}
在HashMap的構(gòu)造函數(shù)中可以看到,Entry表被申明為了數(shù)組,如以下代碼所示:
public
HashMap()
{
this.loadFactor
=
DEFAULT_LOAD_FACTOR;
threshold
=
(int)(DEFAULT_INITIAL_CAPACITY
*
DEFAULT_LOAD_FACTOR);
table
=
new
Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
在以上構(gòu)造函數(shù)中,默認(rèn)的DEFAULT_INITIAL_CAPACITY值為16,DEFAULT_LOAD_FACTOR的值為0.75。
當(dāng)put一個(gè)元素到HashMap中去時(shí),其內(nèi)部實(shí)現(xiàn)如下:
public
V
put(K
key,
V
value)
{
if
(key
==
null)
return
putForNullKey(value);
int
hash
=
hash(key.hashCode());
int
i
=
indexFor(hash,
table.length);
...
}
hash是方法的參數(shù),具體的計(jì)算你看下面的第49行
String?hashCode=hash.........
第49行是計(jì)算hashCode,在第51行 調(diào)用 getCharacter(user,hashCode,null)這個(gè)方法,并將hashCode作為參數(shù)傳進(jìn)去,也就是傳到了第37行 開(kāi)始的方法里。
說(shuō)白了就是你基礎(chǔ)太差,看不懂。這其實(shí)就是個(gè)最簡(jiǎn)單的方法調(diào)用和參數(shù)傳遞。
hash是Object的一個(gè)方法 Object.hashCode() ; 返回值是int類(lèi)型
1、Hash值有什么用?
HashMap、HashTable、HashSet,所以涉及到使用Hash值進(jìn)行優(yōu)化存儲(chǔ)的地方,都會(huì)用到HashCode。HashCode是Key,這種計(jì)算為提高計(jì)算的性能。想想看,一般來(lái)說(shuō),數(shù)組算是比較快的集合類(lèi)了吧,直接用index定位元素,簡(jiǎn)直就是O(1)的級(jí)別。但是添加元素就不這么樂(lè)觀了。但是使用hash類(lèi)的集合,添加元素,移動(dòng)的元素少,只影響一小塊,并且查找元素,由于hash值已經(jīng)進(jìn)行了定位分組,所以也會(huì)大大縮小涉及面,快速定位。
2、Hash值應(yīng)該符合什么原則?
A、等冪性。不管執(zhí)行多少次獲取Hash值的操作,只要對(duì)象不變,那么Hash值是固定的。如果第一次取跟第N次取不一樣,那就用起來(lái)很麻煩,需要記錄當(dāng)前是第幾次操作,這種需要記錄狀態(tài)的事情,可不是什么好事。
B、對(duì)等性。若兩個(gè)對(duì)象equal方法返回為true,則其hash值也應(yīng)該是一樣的。舉例說(shuō)明:若你將objA作為key存入HashMap中,然后new了一個(gè)objB。在你看來(lái)objB和objA是一個(gè)東西(因?yàn)樗麄僥qual),但是使用objB到hashMap中卻取不出來(lái)東西。
C、互異性。若兩個(gè)對(duì)象equal方法返回為false,則其hash值最好也是不同的,但這個(gè)不是必須的,只是這樣做會(huì)提高h(yuǎn)ash類(lèi)操作的性能(碰撞幾率低)。
3、Hash值應(yīng)該怎么計(jì)算?
A、簡(jiǎn)單計(jì)算就是組成成員的hash值直接相加即可。比如ObjectA有三個(gè)屬性,propA、propB和propC,最直接的計(jì)算方式就是propA.hashcode+propB.hashcode+propC.hashcode。
B、但是如果遇到有順序相關(guān)的怎么辦?比如String類(lèi)型是由char數(shù)組組成,并且這些數(shù)組是有順序的。如果使用第一種計(jì)算方法,則“ABCD”和“BCDA”就會(huì)產(chǎn)生同樣的hashCode,那么怎么辦呢?最直接想到的辦法就是加權(quán),不同的index加不同的權(quán)值,這個(gè)權(quán)值的確定最直接的方法就是某個(gè)常數(shù)值的幾次冪。比如為String的計(jì)算hash值為K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的選擇也有說(shuō)法,最好不要是偶數(shù),因?yàn)榕紨?shù)的相乘會(huì)造成信息的丟失(乘以2就是左移1位,一旦溢出就會(huì)造成信息的丟失,這種計(jì)算會(huì)造成溢出后的值與某個(gè)看似不相關(guān)的數(shù)值得到的結(jié)果是一樣的),所以最好是奇數(shù),在這一點(diǎn)上比較推薦使用7,因?yàn)?=8-1=2^3-1,這樣計(jì)算的時(shí)候,直接左移幾位再進(jìn)行一次普通的加減法即可(Java中常用的是31(32-1=2^5-1))。
Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長(zhǎng)度的輸入(又叫做預(yù)映射, pre-image),通過(guò)散列算法,變換成固定長(zhǎng)度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會(huì)散列成相同的輸出,而不可能從散列值來(lái)唯一的確定輸入值。
簡(jiǎn)單的說(shuō)就是一種將任意長(zhǎng)度的消息壓縮到某一固定長(zhǎng)度的消息摘要的函數(shù)。
HASH主要用于信息安全領(lǐng)域中加密算法,他把一些不同長(zhǎng)度的信息轉(zhuǎn)化成雜亂的128位的編碼里,叫做HASH值. 也可以說(shuō),hash就是找到一種數(shù)據(jù)內(nèi)容和數(shù)據(jù)存放地址之間的映射關(guān)系
了解了hash基本定義,就不能不提到一些著名的hash算法,MD5 和 SHA1 可以說(shuō)是目前應(yīng)用最廣泛的Hash算法,而它們都是以 MD4 為基礎(chǔ)設(shè)計(jì)的。那么他們都是什么意思呢?
這里簡(jiǎn)單說(shuō)一下:
1) MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設(shè)計(jì)的,MD 是 Message Digest 的縮寫(xiě)。它適用在32位字長(zhǎng)的處理器上用高速軟件實(shí)現(xiàn)--它是基于 32 位操作數(shù)的位操作來(lái)實(shí)現(xiàn)的。
2) MD5
MD5(RFC 1321)是 Rivest 于1991年對(duì)MD4的改進(jìn)版本。它對(duì)輸入仍以512位分組,其輸出是4個(gè)32位字的級(jí)聯(lián),與 MD4 相同。MD5比MD4來(lái)得復(fù)雜,并且速度較之要慢一點(diǎn),但更安全,在抗分析和抗差分方面表現(xiàn)更好
3) SHA1 及其他
SHA1是由NIST NSA設(shè)計(jì)為同DSA一起使用的,它對(duì)長(zhǎng)度小于264的輸入,產(chǎn)生長(zhǎng)度為160bit的散列值,因此抗窮舉(brute-force)性更好。SHA-1 設(shè)計(jì)時(shí)基于和MD4相同原理,并且模仿了該算法。
新聞名稱(chēng):hash函數(shù)java代碼,hash的實(shí)現(xiàn)
當(dāng)前鏈接:http://chinadenli.net/article32/hsgdpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站排名、網(wǎng)站營(yíng)銷(xiāo)、服務(wù)器托管、微信小程序、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)