2 回答

TA貢獻(xiàn)2條經(jīng)驗 獲得超4個贊
哈希碼可以理解為數(shù)據(jù)的名字,在一大堆數(shù)據(jù)里找到某個數(shù)據(jù),需要指定數(shù)據(jù)一個唯一的名字(重名可不好)。數(shù)據(jù)的名字可以隨便起,自然用編號最好。
生成hash碼的方法多種多樣。核心就是唯一標(biāo)識數(shù)據(jù)。
數(shù)據(jù)有了名字之后怎么使用這個名字呢?建立一個花名冊,就像分配宿舍一樣,一個名字后面對應(yīng)一個宿舍,根據(jù)名字就可以迅速找到目標(biāo),否則就要一個個房間找過來。這比喻這基本上和hash表的原理類似。另一個更合適的比喻是字典,新華字典那種。
恩,差不多就是這樣

TA貢獻(xiàn)143條經(jīng)驗 獲得超187個贊
哈希算法并不是一個特定的算法而是一類算法的統(tǒng)稱。哈希算法也叫散列算法,一般來說滿足這樣的關(guān)系:f(data)=key,輸入任意長度的data數(shù)據(jù),經(jīng)過哈希算法處理后輸出一個定長的數(shù)據(jù)key。同時這個過程是不可逆的,無法由key逆推出data。
如果是一個data數(shù)據(jù)集,經(jīng)過哈希算法處理后得到key的數(shù)據(jù)集,然后將keys與原始數(shù)據(jù)進(jìn)行一一映射就得到了一個哈希表。一般來說哈希表M符合M[key]=data這種形式。
哈希表的好處是當(dāng)原始數(shù)據(jù)較大時,我們可以用哈希算法處理得到定長的哈希值key,那么這個key相對原始數(shù)據(jù)要小得多。我們就可以用這個較小的數(shù)據(jù)集來做索引,達(dá)到快速查找的目的。
稍微想一下就可以發(fā)現(xiàn),既然輸入數(shù)據(jù)不定長,而輸出的哈希值卻是固定長度的,這意味著哈希值是一個有限集合,而輸入數(shù)據(jù)則可以是無窮多個。那么建立一對一關(guān)系明顯是不現(xiàn)實的。所以"碰撞"(不同的輸入數(shù)據(jù)對應(yīng)了相同的哈希值)是必然會發(fā)生的,所以一個成熟的哈希算法會有較好的抗沖突性。同時在實現(xiàn)哈希表的結(jié)構(gòu)時也要考慮到哈希沖突的問題。
密碼上常用的MD5,SHA都是哈希算法,因為key的長度(相對大家的密碼來說)較大所以碰撞空間較大,有比較好的抗碰撞性,所以常常用作密碼校驗。
添加回答
舉報