国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
前言" >前言
1. 什麼是雜湊演算法? " >1. 什麼是雜湊演算法?
#1.1 散列衝突" >#1.1 散列衝突
1.1.1 開放尋址法" >1.1.1 開放尋址法
1.1.2 鍊錶法" >1.1.2 鍊錶法
2. 雜湊演算法的應(yīng)用場景" >2. 雜湊演算法的應(yīng)用場景
2.1 安全加密" >2.1 安全加密
2.2 資料校驗" >2.2 資料校驗
2.3 雜湊函數(shù)" >2.3 雜湊函數(shù)
2.4 負載平衡" >2.4 負載平衡
2.5 資料分片" >2.5 資料分片
2.6 分散式儲存" >2.6 分散式儲存
3. ?寫在最後" >3. ?寫在最後
首頁 Java Java基礎(chǔ) 常用演算法之哈希演算法

常用演算法之哈希演算法

Jun 16, 2020 pm 05:18 PM
java

常用演算法之哈希演算法

前言

#程式設(shè)計師對雜湊演算法應(yīng)該都不陌生,例如業(yè)界著名的MD5、SHA、 CRC等等;在日常開發(fā)中我們經(jīng)常用一個Map來裝載一些具有(key,value)結(jié)構(gòu)的數(shù)據(jù),利用哈希算法O(1)的時間複雜度提高程序處理效率,除此之外,你還知道哈希演算法的其他應(yīng)用場景嗎?

1. 什麼是雜湊演算法?

了解雜湊演算法的應(yīng)用場景前,我們先看下雜湊(雜湊)想法,雜湊就是把任意長度的輸入透過雜湊演算法變換成固定長度的輸出,輸入稱為Key(鍵),輸出為Hash值,即雜湊值hash(key),雜湊演算法即hash()函數(shù)(雜湊與雜湊是對hash的不同翻譯);實際上儲存這些雜湊值的是一個數(shù)組,稱為散列表,散列表用的是數(shù)組支援按照下標隨機存取資料的特性,把資料值與數(shù)組下標按雜湊函數(shù)做的一一映射,從而實現(xiàn)O(1)的時間複雜度查詢;

#1.1 散列衝突

目前的雜湊演算法MD5、SHA、CRC等都無法做到一個不同的key對應(yīng)的雜湊值都不一樣的雜湊函數(shù),即無法避免出現(xiàn)不同的key映射到同一個值的情況,即出現(xiàn)了雜湊衝突,而且,因為陣列的儲存空間有限,也會增加雜湊衝突的機率。如何解決散列衝突?我們常用的雜湊衝突解決方法有兩類:開放尋址法(open addressing) 和 鍊錶法(chaining)。

1.1.1 開放尋址法

透過線性探測的方法找到散列表中空閒位置,寫入hash值:

如圖,834313在hash表中散列到303432的位置上,出現(xiàn)了衝突,則順序遍歷hash表直到找到空閒位置寫入834313;當(dāng)散列表中空閒位置不多的時候,散列衝突的機率就會大大增加,一般情況下,我們會盡可能保證散列衝突中有一定比例的空閒槽位,此時,我們用裝載因子來表示空閒位置的多少,計算公式是:散列表的裝載因子=填入表中的元素個數(shù)/散列表的長度。裝載因子越大,表示空閒位置越少,衝突越多,散列表的效能就會下降。

當(dāng)資料量比較小,裝載因子小的時候,適合採用開放尋址法,這也是java中的ThreadLocalMap使用開放尋址法解決散列衝突的原因。

1.1.2 鍊錶法

鍊錶法是一種較常用的雜湊衝突解決方法,也比較簡單。如圖:

在散列表中,每個桶/槽會對應(yīng)一條鍊錶,所有散列值相同的元素我們都放到相同槽位對應(yīng)的鍊錶中;當(dāng)雜湊衝突比較多時,鍊錶的長度也會變長,查詢hash值需要遍歷鍊錶,這時查詢效率就會從O(1)退化成O(n)。

這種解決散列衝突的處理方法比較適合大物件、大資料量的散列表,而且,支援更多的最佳化策略,例如使用紅黑樹來取代鍊錶;jdk1.8為了對HashMap做進一步優(yōu)化,引入了紅黑樹,當(dāng)鍊錶長度太長(預(yù)設(shè)超過8)時,鍊錶就會轉(zhuǎn)換成紅黑樹,這時可以利用紅黑樹快速增刪查改的特點,提高HashMap的性能,當(dāng)紅黑樹節(jié)點個數(shù)小於8個時,又將紅黑樹轉(zhuǎn)換成為鍊錶,因為在資料量比較小的情況下,紅黑樹要維持平衡,比起鍊錶,效能上的優(yōu)勢並不明顯。

2. 雜湊演算法的應(yīng)用場景

2.1 安全加密

最常用於加密的雜湊演算法是MD5(MD5 Message-Digest Algorithm)和SHA(Secure Hash Algorithm 安全雜湊演算法),利用hash的特徵計算出來的hash值很難反向推導(dǎo)出原始數(shù)據(jù),從而達到加密的目的。

以MD5為例子,哈希值是固定的128位元二進位串,最多能表示2^128 個數(shù)據(jù),這個數(shù)據(jù)已經(jīng)是天文數(shù)字了,散列衝突的機率要小於1/2^ 128,如果希望透過窮舉法來找到跟這個MD5相同的另一個數(shù)據(jù),那耗費的時間也應(yīng)該是天文數(shù)字了,所以在有限的時間內(nèi)哈希演算法還是很難被破解的,這也就達到了加密效果了。

2.2 資料校驗

利用Hash函數(shù)對資料敏感的特點,可以用來校驗網(wǎng)路傳輸過程中的資料是否正確,防止被惡意串改。

2.3 雜湊函數(shù)

利用hash函數(shù)相對均勻分佈的特點,取hash值作為資料儲存的位置值,讓資料均勻分佈在容器裡面。

2.4 負載平衡

透過hash演算法,對客戶端id位址或會話id進行計算hash值,將取得的雜湊值與伺服器清單的大小進行取模運算,最終得到的值就是應(yīng)該要路由到的伺服器編號。

2.5 資料分片

假如我們有1T的日誌文件,裡面記錄了使用者的搜尋關(guān)鍵字,我們想要快速統(tǒng)計每個關(guān)鍵字被搜尋的次數(shù),該怎麼做呢?資料量比較大,很難放到一臺機的記憶體中,即使放到一臺機子上,處理時間也會很長,針對這個問題,我們可以先對資料進行分片,然後再用多臺機器處理的方法,來提高處理速度。

具體的想法是:為了提高處理速度,我們用n臺機器並行處理。從搜尋記錄的日誌檔案中,依序獨處每個搜尋關(guān)鍵字,並透過雜湊函數(shù)計算哈希值,然後再跟n取模,最終得到的值,就是應(yīng)該被分配到的機器編號;這樣哈希值相同的搜尋關(guān)鍵字就被分配到了同一臺機器上,每個機器會分別計算關(guān)鍵字出現(xiàn)的次數(shù),最後合併起來就是最終的結(jié)果。實際上,這裡的處理過程也是MapReduce的基本設(shè)計想法。

2.6 分散式儲存

對於海量的資料需要快取的情況,一臺快取機器肯定是不夠的,於是,我們就需要將資料分散在多臺機器上。 這時,我們可以藉助前面的分片思想,也就是透過雜湊演算法對資料取哈希值,然後對機器個數(shù)取模,得到應(yīng)該儲存的快取機器編號。

但是,如果資料增多,原來的10臺機器已無法承受,需要擴容了,這時是如果所有資料都重新計算哈希值,然後重新搬移到正確的機器上,那就相當(dāng)於所有的快取資料一下子都失效了,會穿透快取回源到資料庫,這樣就可能發(fā)生雪崩效應(yīng),壓垮資料庫。為了新增快取機器不搬移所有的數(shù)據(jù),一致性雜湊演算法就是比較好的選擇了,主要的想法是:假設(shè)我們有kge機器,資料的雜湊值範圍是[0, Max],我們將整個範圍劃分成m個小區(qū)間(m遠大於k),每個機器負責(zé)m/k個小區(qū)間,當(dāng)有新機器加入時,我們就將某幾個小區(qū)間的數(shù)據(jù),從原來的機器中搬移到新的機器中,這樣,即不用全部重新哈希、搬移數(shù)據(jù),也保持了各個機器上數(shù)據(jù)量的平衡。

3. ?寫在最後

實際上,哈希演算法還有很多其他的應(yīng)用,例如git commit id等等,很多應(yīng)用都來自於對演算法的理解和擴展,也是基礎(chǔ)的資料結(jié)構(gòu)和演算法的價值體現(xiàn),需要我們在工作中慢慢理解和體會。

推薦教學(xué):《Java教學(xué)

以上是常用演算法之哈希演算法的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點實現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

了解Java虛擬機(JVM)內(nèi)部 了解Java虛擬機(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達對象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險。 1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對像被標記為垃圾。 2.基於標記-清除算法,標記所有可達對象,清除未標記對象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按後進先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

See all articles