hash(哈希)是什么
hash(哈希)是什么
一、什么是哈希
hash,一般翻譯為散列、雜湊,或者音譯為哈希,是把任意長(zhǎng)度的輸入(又叫做預(yù)映射pre-image)通過散列算法變換成固定長(zhǎng)度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間。
它其實(shí)就是一個(gè)算法,最簡(jiǎn)單的算法就是加減乘除,比方,我設(shè)計(jì)個(gè)數(shù)字算法,輸入+7=輸出,比如我輸入1,輸出為8;輸入2,輸出為9。
哈希算法不過是一個(gè)更為復(fù)雜的運(yùn)算,它的輸入可以是字符串,可以是數(shù)據(jù),可以是任何文件,經(jīng)過哈希運(yùn)算后,變成一個(gè)固定長(zhǎng)度的輸出,該輸出就是哈希值。但是哈希算法有一個(gè)很大的特點(diǎn),就是你不能從結(jié)果推算出輸入,所以又稱為不可逆的算法。
如上所示,“Kwan”經(jīng)過哈希運(yùn)算后,會(huì)得到一個(gè)隨機(jī)數(shù)列,而且不管你的輸入文件多大,最后得到的結(jié)果都是這么一個(gè)固定長(zhǎng)度的數(shù)列,即使你輸入的是一部電影,輸出也是這么大。而且通過數(shù)列不能推導(dǎo)出輸入。
二、哈希特性
1、不可逆:在具備編碼功能的同時(shí),哈希算法也作為一種加密算法存在。即,你無法通過分析哈希值計(jì)算出源文件的樣子,換句話說:你不可能通過觀察香腸的紋理推測(cè)出豬原來的樣子。
2、計(jì)算極快:20G高清電影和一個(gè)5K文本文件復(fù)雜度相同,計(jì)算量都極小,可以在0.1秒內(nèi)得出結(jié)果。也就是說,不管豬有多肥,骨頭多硬,做成香腸都只要眨眨眼的時(shí)間。
三、哈希的用途
哈希算法的不可逆特性使其在以下領(lǐng)域使用廣泛:
1、密碼,我們?nèi)粘J褂玫母鞣N電子密碼本質(zhì)上都是基于hash的,你不用擔(dān)心支付寶的工作人員會(huì)把你的密碼泄漏給第三方,因?yàn)槟愕牡卿浢艽a是先經(jīng)過 hash+各種復(fù)雜算法得出密文后 再存進(jìn)支付寶的數(shù)據(jù)庫(kù)里的。
2、文件完整性校驗(yàn),通過對(duì)文件進(jìn)行hash,得出一段hash值 ,這樣文件內(nèi)容以后被修改了,hash值就會(huì)變。 MD5 Hash算法的”數(shù)字指紋”特性,使它成為應(yīng)用最廣泛的一種文件完整性校驗(yàn)和(Checksum)算法,不少Unix系統(tǒng)有提供計(jì)算md5 checksum的命令。
3、數(shù)字簽名,數(shù)字簽名技術(shù)是將摘要信息用發(fā)送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,然后用HASH函數(shù)對(duì)收到的原文產(chǎn)生一個(gè)摘要信息,與解密的摘要信息對(duì)比。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數(shù)字簽名能夠驗(yàn)證信息的完整性。
此外,hash算法在區(qū)塊鏈領(lǐng)域也使用廣泛。
四、基于hash的數(shù)據(jù)類型有哪些?
Python 中基于hash的2個(gè)數(shù)據(jù)類型是dict and set , 之前說dict查詢速度快,為何快? 說set天生去重,怎么做到的?其實(shí)都是利用了hash的特性,我們下面來剖析。
1、dict 為何查詢速度超快,且不受dict大小影響 ?
解析:假設(shè)我要存14億人的基本信息
data = {"張三":[23742364782642342323234,28,"山東濟(jì)南"],"李四":[12124234232311214458271,25,"北京昌平"],"王五":[23030293483727384383929,33,"山東濟(jì)南"],"趙六":[42302033030302482634674,28,"河北保定"],# "alex":["xxxx"],# "黑姑娘":["xxxx"]# ... }dict 的每個(gè)key 都要先經(jīng)過hash生成一段固定長(zhǎng)度的hash值,假設(shè)生成的hash值如下:
dict會(huì)把這些數(shù)字按大小排序好放在一個(gè)列表里kd = [-10, 53, 67, 81, 99, 123]。當(dāng)我們想查找”趙六”的信息時(shí), 會(huì)把“趙六”先hash, 得到99這個(gè)值,然后拿這個(gè)值去到kd列表里找,想象這個(gè)列表有14億個(gè)值 ,如何快速找到99? 二分法就行。
只要找到了99的位置,就可以定位到趙六對(duì)應(yīng)的value的值了。 通過2分法查找,每次數(shù)據(jù)量都會(huì)少一半,這樣查找最多31次(2**31=2147483648)就能從20億信息里找到這個(gè)人的信息。
當(dāng)然 dict 真實(shí)的查找算法比這個(gè)還要復(fù)雜些, 這里只是通過這個(gè)例子讓大家理解下為何基于hash的數(shù)據(jù)類型查找速度會(huì)快很多。
2、set為何是天生去重的?
因?yàn)槊看嬉粋€(gè)值到set里時(shí), 都要先經(jīng)過hash,然后通過得出的這個(gè)hash值算出應(yīng)該存在set里的哪個(gè)位置,存的時(shí)候會(huì)先檢查那個(gè)位置上有沒有值 ,有的話就對(duì)比是否相等,如果相等,則不再存儲(chǔ)此值。 如果不相等(即為空),則把新值 存在這。
轉(zhuǎn)載于:https://www.cnblogs.com/Kwan-C/p/11477599.html
總結(jié)
以上是生活随笔為你收集整理的hash(哈希)是什么的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《简明电路分析》——1.2节电学主要参数
- 下一篇: 工信部第五届“绽放杯”5G应用征集大赛通