Hash——初識
什麼是雜湊函式
雜湊(Hash)函式是一個映象,即: 將關鍵字的集合對映到某個地址集合上,它的設定很靈活,只要這個地址集合的大小不超出允許範圍即可;
任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,所輸出的稱為雜湊值。
這種變換是一種壓縮對映,也即雜湊值所佔的空間一般來說遠小於輸入值的空間,不同的輸入可能會雜湊出相同的輸出(概率很小)。
雜湊表
雜湊表(Hash table,也叫雜湊表),是根據鍵--碼值(Key value)而直接進行訪問的資料結構。
也就是說,它通過把鍵--碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。
雜湊對映和衝突
雜湊的本質就是數學,簡單來說雜湊函式實現了各種長度和形式的輸入經過公開的雜湊函式的運算生成一個固定長度的串,並且這個過程是單向不可逆的,也就是無法從雜湊生成的串逆轉為最初的輸入。
輸入是無窮盡的,生成的雜湊串長度是固定的,那麼必然面臨著多個不一樣的輸入被對映壓縮為一個相同的雜湊串,就是無限集合對映有限集合導致的雜湊碰撞或者叫雜湊衝突。
雜湊演算法的特點
快速性,效率高
不可逆性
敏感性
低碰撞性(連結串列)
JAVA中的Hash演算法
①hashMap 側重點是速度
②Object.hashCode 直接獲取記憶體地址
③Integer.hashCode 直接返回intValue
④String.hashCode 根據字串內容生成hashCode,字串一樣則hashCode也相同
其他場景的Hash演算法:MD4、MD5 SHA( SHA-1、SHA-256)
Hash演算法的用途
1.雜湊查詢、雜湊表
2.秒傳
3.HashMap
4.加解密,數字簽名,MD5,SHA
5.Git
6.比特幣,區塊鏈
HashMap
生日碰撞
問題:假定一個班級中有50個人,則有兩個人生日相同的概率為多大?
【錯誤方式】如果沒有經過嚴密的數學推導,很多人第一反應為 50/365=10/73,大概七分之一,由此看來發生的概率比較小。
【正確方式】實際上,如果按照概率來看:設P為生日不在同一天的概率,則發生的概率為1-P
如果有三個人(n=3)的話,則概率P = 365/365 *364/365 * 363/365,以此類推通過公式可以計算得出:
當n=10時,P=88.3%,1-P=11.7%
當n=20時,P=58.8%,1-P=41.2%
當n=50時,P=2.9%, 1-P=97.1%
一般而言,對於總數為n的情況下,若要發生碰撞的概率大於50%,只需要發生 1.2*根號n 次,
例如:當n為100時,只需發生12次,就有50%可能發生碰撞
數字簽名
不對稱加密
所謂不對稱加密,是對於對稱加密而言的,傳統的對稱加密只有一個祕鑰(你可以理解為密碼),你用這個祕鑰加密,別人也用這個祕鑰解密,
這裡面有個弊端就是,你把解密的密碼告訴別人時,比如發簡訊、發微信,這時候回受到中間人攻擊,簡單舉例說就是運營商等會看到你發的密碼,然後你們之間的通訊資料就被解開。
不對稱加密一個重要特點就是:公鑰加密的資料私鑰可以解密,私鑰加密的資料公鑰可以解密
數字簽名
數字簽名又是什麼呢,其實也很簡單了,大白話來講也是一個加密解密過程,就是將資料用你的私鑰進行加密,然後把明文和密文都發給對方,
對方用你的公鑰對密文進行解密,然後比對解密後的明文是不是一樣,這樣就證明這個資料沒有被第三方篡改,的確是你書寫的
相關文章
- 快速識別Hash加密方式hashid加密
- Java初識Java
- srpingboot 初識boot
- 初識JavaJava
- 初識htmlHTML
- 初識Kubernetes
- Spring 初識Spring
- 初識WebWeb
- 初識WebAssemblyWeb
- 初識Fink
- AsterixDB初識AST
- 初識PostgreSqlSQL
- 初識DevOpsdev
- 初識 NodejsNodeJS
- 初識RedisRedis
- 初識 Shell
- 初識 reduxRedux
- 初識 SpringMVCSpringMVC
- rocketmq初識MQ
- 初識 DockerDocker
- 初識:LevelDB
- 初識Proxy
- 初識JVMJVM
- 初識JavaScriptJavaScript
- 初識MybatisMyBatis
- 初識AngularJSAngularJS
- Kafka 初識Kafka
- 初識AJAX
- 初識GOGo
- 初識dockerDocker
- 初識 “HTML”HTML
- 初識GolangGolang
- 初識jQueryjQuery
- Nodejs初識NodeJS
- Express初識Express
- 初識GitGit
- 初識JSJS
- 初識promisePromise