日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hash是什么?

發(fā)布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hash是什么? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? 最近讀關(guān)于php內(nèi)核的資料,發(fā)現(xiàn)php中 在實現(xiàn)變量以及數(shù)據(jù)類型的實現(xiàn)中大量使用哈希算法,并且非常細(xì)致做出了很多優(yōu)秀的細(xì)節(jié)設(shè)計。比如:在 zend.hash.h 中

static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength) {register ulong hash = 5381;/* variant with the hash unrolled eight times */for (; nKeyLength >= 8; nKeyLength -= 8) {hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;}switch (nKeyLength) {case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */case 1: hash = ((hash << 5) + hash) + *arKey++; break;case 0: break; EMPTY_SWITCH_DEFAULT_CASE()}return hash; }

相比較常用的 times 33 算法,會快一些了;

(相對web開發(fā)角度而言,我用自己的話來概括下 哈希)哈希是一種做法的總稱,這種做法指的就是 將一個字串(也可以說是數(shù)據(jù))進(jìn)行雜糅,得出一個定長的另一個字串(也可以說另一個數(shù)據(jù)),然后我們就可以用省的字串來 代替原來的字串了,就有指紋驗證的特征了。

? ? 目前已經(jīng)有算法去實現(xiàn)這種做法了,比如:md5,sha1等等,使用算法去達(dá)到 不可逆,不重復(fù)的目的,當(dāng)然這不是絕對的,只是很小很小概率上不重復(fù)不可逆,換句話說,就是目前你窮盡你所有的計算資源以及時間去也很難去逆轉(zhuǎn)。

? ?我認(rèn)為hash算法是 很美妙的工具,他讓數(shù)據(jù)在傳輸過程中真正有了保密性,而且好多web開發(fā)的校驗過程都有使用它,下面來一段比較專業(yè)術(shù)語來描述吧,


抗碰撞能力:對于任意兩個不同的數(shù)據(jù)塊,其hash值相同的可能性極小;對于一個給定的數(shù)據(jù)塊,找到和它hash值相同的數(shù)據(jù)塊極為困難。
抗篡改能力:對于一個數(shù)據(jù)塊,哪怕只改動其一個比特位,其hash值的改動也會非常大。
在用到hash進(jìn)行管理的數(shù)據(jù)結(jié)構(gòu)中,比如hashmap,hash值(key)存在的目的是加速鍵值對的查找,key的作用是為了將元素適當(dāng)?shù)胤旁诟鱾€桶里,對于抗碰撞的要求沒有那么高。換句話說,hash出來的key,只要保證value大致均勻的放在不同的桶里就可以了。但整個算法的set性能,直接與hash值產(chǎn)生的速度有關(guān),所以這時候的hash值的產(chǎn)生速度就尤為重要,以JDK中的String.hashCode()方法為例:
public int hashCode() { int h = hash; //hash default value : 0 if (h == 0 && value.length > 0) { //value : char storage char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }

很簡潔的一個乘加迭代運(yùn)算,在不少的hash算法中,使用的是異或+加法進(jìn)行迭代,速度和前者差不多。

在密碼學(xué)中,hash算法的作用主要是用于消息摘要和簽名,換句話說,它主要用于對整個消息的完整性進(jìn)行校驗。舉個例子,我們登陸知乎的時候都需要輸入密碼,那么知乎如果明文保存這個密碼,那么黑客就很容易竊取大家的密碼來登陸,特別不安全。那么知乎就想到了一個方法,使用hash算法生成一個密碼的簽名,知乎后臺只保存這個簽名值。由于hash算法是不可逆的,那么黑客即便得到這個簽名,也絲毫沒有用處;而如果你在網(wǎng)站登陸界面上輸入你的密碼,那么知乎后臺就會重新計算一下這個hash值,與網(wǎng)站中儲存的原h(huán)ash值進(jìn)行比對,如果相同,證明你擁有這個賬戶的密碼,那么就會允許你登陸。銀行也是如此,銀行是萬萬不敢保存用戶密碼的原文的,只會保存密碼的hash值而而已。

哈希算法并不是一個特定的算法而是一類算法的統(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的長度(相對大家的密碼來說)較大所以碰撞空間較大,有比較好的抗碰撞性,所以常常用作密碼校驗。

?

轉(zhuǎn)載于:https://www.cnblogs.com/guixiaoming/p/7805025.html

總結(jié)

以上是生活随笔為你收集整理的hash是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。