第三章 hash是個啥玩意

3.10 hash

  1. 什麼是哈希?

    hash,通常翻譯作散列、雜湊,或音譯爲哈希,是把任意長度的輸入(又叫作預映射pre-image)經過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間。算法

    它其實就是一個算法,最簡單的算法就是加減乘除,比方,我設計個數字算法,輸入+7=輸出,好比我輸入1,輸出爲8;輸入2,輸出爲9。數據庫

    哈希算法不過是一個更爲複雜的運算,它的輸入能夠是字符串,能夠是數據,能夠是任何文件,通過哈希運算後,變成一個固定長度的輸出,該輸出就是哈希值。可是哈希算法有一個很大的特色,就是你不能從結果推算出輸入,因此又稱爲不可逆的算法函數

    >>> hash('我愛你')3471388576844338423>>> hash('小猿圈')5000768010434506639

    如上所示,輸入「我愛你」三個字,通過哈希運算後,會獲得一個隨機數列,並且無論你的輸入文件多大,最後獲得的結果都是這麼一個固定長度的數列,即便你輸入的是一部電影,輸出也是這麼大。並且經過數列不能推導出輸入。區塊鏈

     

  1. 哈希特性

    不可逆:在具有編碼功能的同時,哈希算法也做爲一種加密算法存在。即,你沒法經過分析哈希值計算出源文件的樣子,換句話說:你不可能經過觀察香腸的紋理推測出豬原來的樣子。編碼

    計算極快:20G高清電影和一個5K文本文件複雜度相同,計算量都極小,能夠在0.1秒內得出結果。也就是說,無論豬有多肥,骨頭多硬,作成香腸都只要眨眨眼的時間加密

     

  2. 哈希的用途

    哈希算法的不可逆特性使其在如下領域使用普遍spa

    1. 密碼,咱們平常使用的各類電子密碼本質上都是基於hash的,你不用擔憂支付寶的工做人員會把你的密碼泄漏給第三方,由於你的登陸密碼是先通過 hash+各類複雜算法得出密文後 再存進支付寶的數據庫裏的翻譯

    2. 文件完整性校驗,經過對文件進行hash,得出一段hash值 ,這樣文件內容之後被修改了,hash值就會變。 MD5 Hash算法的」數字指紋」特性,使它成爲應用最普遍的一種文件完整性校驗和(Checksum)算法,很多Unix系統有提供計算md5 checksum的命令。設計

    3. 數字簽名,數字簽名技術是將摘要信息用發送者的私鑰加密,與原文一塊兒傳送給接收者。接收者只有用發送者的公鑰才能解密被加密的摘要信息,而後用HASH函數對收到的原文產生一個摘要信息,與解密的摘要信息對比。若是相同,則說明收到的信息是完整的,在傳輸過程當中沒有被修改,不然說明信息被修改過,所以數字簽名可以驗證信息的完整性。視頻

      此外,hash算法在區塊鏈領域也使用普遍。

  3. 基於hash的數據類型有哪些?

    • Python 中基於hash的2個數據類型是dict and set , 以前說dict查詢速度快,爲什麼快? 說set天生去重,怎麼作到的?其實都是利用了hash的特性,咱們下面來剖析

    • dict 爲什麼查詢速度超快,且不受dict大小影響 ?

      • 解析:假設我要存14億人的基本信息

        data = {    "張三":[23742364782642342323234,28,"山東濟南"],    "李四":[12124234232311214458271,25,"北京昌平"],    "王五":[23030293483727384383929,33,"山東濟南"],    "趙六":[42302033030302482634674,28,"河北保定"],    # "alex":["xxxx"],   # "黑姑娘":["xxxx"]   # ...}
      • dict 的每一個key 都要先通過hash生成一段固定長度的hash值,假設生成的hash值以下

      • dict會把這些數字按大小排序好放在一個列表裏kd = [-10, 53, 67, 81, 99, 123]當咱們想查找」趙六」的信息時, 會把「趙六」先hash, 獲得99這個值,而後拿這個值去到kd列表裏找,想象這個列表有14億個值 ,如何快速找到99? 二分法就行,具體看剖析視頻。

        只要找到了99的位置,就能夠定位到趙六對應的value的值了。 經過2分法查找,每次數據量都會少一半,這樣查找最多31次(2**31=2147483648)就能從20億信息裏找到這我的的信息。

        固然 dict 真實的查找算法比這個還要複雜些, 我只是經過這個例子讓你們理解下爲什麼基於hash的數據類型查找速度會快不少。

  4. set爲什麼是天生去重的?

    由於每存一個值到set裏時, 都要先通過hash,而後經過得出的這個hash值算出應該存在set裏的哪一個位置,存的時候會先檢查那個位置上有沒有值 ,有的話就對比是否相等,若是相等,則再也不存儲此值。 若是不相等(即爲空),則把新值 存在這。

相關文章
相關標籤/搜索