python dict hash算法_2020年3月26日python學習筆記——hash

什么是哈希?

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

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

哈希算法不過是一個更為復雜的運算,它的輸入可以是字符串,可以是數據,可以是任何文件,經過哈希運算后,變成一個固定長度的輸出,該輸出就是哈希值。但是哈希算法有一個很大的特點,就是你不能從結果推算出輸入,所以又稱為不可逆的算法

如上所示,輸入“我愛你”三個字,經過哈希運算后,會得到一個隨機數列,而且不管你的輸入文件多大,最后得到的結果都是這么一個固定長度的數列,即使你輸入的是一部電影,輸出也是這么大。而且通過數列不能推導出輸入。

哈希特性

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

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

哈希的用途

哈希算法的不可逆特性使其在以下領域使用廣泛

密碼,我們日常使用的各種電子密碼本質上都是基于hash的,你不用擔心支付寶的工作人員會把你的密碼泄漏給第三方,因為你的登錄密碼是先經過 hash+各種復雜算法得出密文后 再存進支付寶的數據庫里的

文件完整性校驗,通過對文件進行hash,得出一段hash值 ,這樣文件內容以后被修改了,hash值就會變。 MD5 Hash算法的”數字指紋”特性,使它成為應用最廣泛的一種文件完整性校驗和(Checksum)算法,不少Unix系統有提供計算md5 checksum的命令。

數字簽名,數字簽名技術是將摘要信息用發送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發送者的公鑰才能解密被加密的摘要信息,然后用HASH函數對收到的原文產生一個摘要信息,與解密的摘要信息對比。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數字簽名能夠驗證信息的完整性。

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

基于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值如下

78aa2a737fe034805cb058c7f9ce7755.png

dict會把這些數字按大小排序好放在一個列表里kd = [-10, 53, 67, 81, 99, 123]

當我們想查找”趙六”的信息時, 會把“趙六”先hash, 得到99這個值,然后拿這個值去到kd列表里找,想象這個列表有14億個值 ,如何快速找到99? 二分法就行,具體看剖析視頻。

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

當然 dict 真實的查找算法比這個還要復雜些, 我只是通過這個例子讓大家理解下為何基于hash的數據類型查找速度會快很多。

set為何是天生去重的?

因為每存一個值到set里時, 都要先經過hash,然后通過得出的這個hash值算出應該存在set里的哪個位置,存的時候會先檢查那個位置上有沒有值 ,有的話就對比是否相等,如果相等,則不再存儲此值。 如果不相等(即為空),則把新值 存在這。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393482.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393482.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393482.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據處理不等式:Data Processing Inequality

我是在差分隱私下看到的,新解決方案的可用性肯定小于原有解決方案的可用性,也就是說信息的后續處理只會降低所擁有的信息量。 那么如果這么說的話為什么還要做特征工程呢,這是因為該不等式有一個巨大的前提就是數據處理方法無比的強大&#x…

aws架構_如何使用AWS構建可擴展架構

aws架構What I learned building the StateOfVeganism ?我學到的建立素食主義的方法是什么? By now, we all know that news and media shape our views on the topics we discuss. Of course, this is different from person to person. Some might be influence…

gulp 實現sass自動化 ,監聽同步

實現功能 監聽scss文件   sass自動化 準備條件 1 .安裝gulp npm init ---->一直enter,會在當前目錄下生成一個package.json文件,記錄安裝的依賴模塊 npm install gulp --save-dev 2 .安裝gulp-ruby-sass npm install gulp-ruby-sass 你還需要安裝ruby環境…

leetcode面試題 10.03. 搜索旋轉數組(二分法)

搜索旋轉數組。給定一個排序后的數組,包含n個整數,但這個數組已被旋轉過很多次了,次數不詳。請編寫代碼找出數組中的某個元素,假設數組元素原先是按升序排列的。若有多個相同元素,返回索引值最小的一個。 示例1: 輸入…

MSSQL → 02:數據庫結構

一、數據庫的組成 在SQL Server 2008中,用戶如何訪問及使用數據庫,就需要正確了解數據庫中所有對象及其設置。數據庫就像一個容器,它里面除了存放著數據的表之外,還有視圖、存儲過程、觸發器、約束等數據庫對象。數據庫管理的核心…

JAVA拳皇_拳皇(Java簡單的小程序)代碼實例|chu

剛開始學習Java,看完老九君的視頻根據他的內容敲的代碼,感覺還挺有成就感的,畢竟剛學習Java。package helloasd;import java.util.*; public class hellojava { public static void main(String[] args) { Scanner input new Scanner(System…

mySQL教程 第9章 觸發器

第9章 觸發器 入的新數據放到new表,刪除的數據放到old表。 準備本章學習環境 連接數據庫schoolDB,刪除表TStudent,TScore和Tsubject中的所有數據。 delete from TStudent; delete from TScore; delete from TSubject; 向學生表插入兩條記錄 i…

vue使用python_如何使用Python和Vue創建兩人游戲

vue使用pythonby Neo Ighodaro由新Ighodaro 如何使用Python和Vue創建兩人游戲 (How to create a two-player game with Python and Vue) In this tutorial, we will create a realtime tic-tac-toe game using Python and Pusher channels. Here’s a demo of how the game wi…

掩碼圖制作photoshop__新手用

1.首先你得有一張圖,比如這樣的: 2.用PS打開他 3.左邊工具欄里(快速選擇工具W),選想顯示的部分 4.ctrlc復制一下,新建一張黑底圖粘貼上去或者白底圖時選中顯示區即花瓣右鍵反向右鍵填充成黑色 5.菜單欄->…

leetcode287. 尋找重復數(二分法)

給定一個包含 n 1 個整數的數組 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重復的整數。假設只有一個重復的整數,找出這個重復的數。 示例 1: 輸入: [1,3,4,2,2] 輸出: 2 代碼 class Solution {…

os-enviroment

pip3 install PyUserInput ping 是不帶協議的轉載于:https://www.cnblogs.com/liuweimingcprogram/p/10957592.html

java 壓縮 亂碼_如何解決java壓縮文件亂碼問題

用java來打包文件生成壓縮文件,有兩個地方會出現亂碼:內容的中文亂碼問題:修改sun的源碼。使用開源的類庫org.apache.tools.zip.ZipOutputStream和org.apache.tools.zip.ZipEntry,這兩個類ant.jar中有,可以下載使用即可…

Unity3D手機斗地主游戲開發實戰(02)_叫地主功能實現

大體思路 前面我們實現了點擊開始游戲按鈕,系統依次給玩家發牌的邏輯和動畫,并展示當前的手牌。這期我們繼續實現接下來的功能--叫地主。 1.首先這兩天,學習了DOTween,這是一個強大的Unity動畫插件,大家可以參考&#…

TensorFlow 學習(十)—— 工具函數

1. 基本 tf.clip_by_value() 截斷,常和對數函數結合使用 # 計算交叉熵crose_ent -tf.reduce_mean(tf.log(y_*tf.clip_by_value(y, 1e-10, 1.))) a tf.reshape(tf.range(6, dtypetf.float32), [2, 3]) tf.clip_by_value(a, 2.5, 4.5) # 將值限定在 2.5 …

delphi5開發人員指南_非設計人員的網頁設計開發人員指南

delphi5開發人員指南I created my first website as a school project when I was 14. The task was simple: create a very basic site including some text, images, and a table. My usual attitude to school projects was to completely forget about them and later come…

leetcode1292. 元素和小于等于閾值的正方形的最大邊長(二分法+前綴和)

給你一個大小為 m x n 的矩陣 mat 和一個整數閾值 threshold。 請你返回元素總和小于或等于閾值的正方形區域的最大邊長;如果沒有這樣的正方形區域,則返回 0 。 示例 2: 輸入:mat [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2…

java 反射 獲取成員_java 反射獲取成員

package com.wxjaa; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestReflect { public static void main(String[] args) throws Exception { // getDeclaredField 可以獲取私有成員, …

Koa 中實現 chunked 數據傳輸

有關于 Transfer-Encoding:chunked 類型的響應,參見之前的文章HTTP 響應的分塊傳輸。這里看 Koa 中如何實現。 Koa 中請求返回的處理 雖然官方文檔有描述說明不建議直接調用 response.write: Bypassing Koas response handling is not supported. Avoid …

git 短寫設置_如何在短短幾分鐘內設置一個Git客戶端

git 短寫設置Today we’re going to talk about Git. You’re going to learn what Git is and how to set up a Git client on your computer.今天我們將討論Git。 您將學習什么是Git,以及如何在計算機上設置Git客戶端。 什么是Git? (What is Git?) I…

P1977 出租車拼車

P1977 出租車拼車 題目背景 話說小 x 有一次去參加比賽,雖然學校離比賽地點不太遠,但小 x 還是想坐 出租車去。大學城的出租車總是比較另類,有“拼車”一說,也就是說,你一個人 坐車去,還是一堆人一起&#…