1. 程式人生 > 其它 >短視訊軟體開發,日期時間控制元件的應用

短視訊軟體開發,日期時間控制元件的應用

1、什麼是雜湊表?
雜湊表(HashTable)又叫做散列表,是根據關鍵碼值(即鍵值對)而直接訪問的資料結構。也就是說,它通過把關鍵碼對映到表中一個位置來訪問記錄,以加快查詢速度。看到這裡你可能比較疑惑,它是怎麼加快查詢速度的?下一節就有說明!這個對映函式就叫做雜湊(雜湊)函式,存放記錄的陣列叫做散列表。

2、為什麼雜湊表的速度快?
在資料結構中,我們對兩種資料結構應該會非常熟悉:陣列與連結串列。陣列的特點就是查詢容易,插入刪除困難;而連結串列的特點就是查詢困難,但是插入刪除容易。既然兩者各有優缺點,那麼我們就將兩者的有點結合起來,讓它查詢容易,插入刪除也會快起來。雜湊表就是講兩者結合起來的產物。

3、雜湊如何查詢?
雜湊的查詢就是下面兩個步驟:

<1>使用雜湊函式將被查詢的鍵轉化為陣列的索引。在理想的狀態下,不同的鍵會被轉化成不同的索引值。但是那是理想狀態,我們實踐當中是不可能一直是理想狀態的。當不同的鍵生成了相同的索引的時候,也就是我們所說的衝突,我們這個時候就要處理衝突。

<2> 處理衝突的方法很多,後面我們介紹拉鍊法和線性探索法。

雜湊表是一個時間和空間上平衡的例子。如果沒有空間的限制,我們可以直接用鍵來作為陣列的索引,這樣可以將查詢時間做到最快(O(1))。如果沒有時間的限制,我們可以使用無序連結串列進行順序查詢,這樣只需要很少的記憶體。

4、什麼是雜湊函式?
雜湊函式其實就是我們常說的雜湊演算法,主要應用在以下這幾個方面:檔案校驗、數字簽名、鑑權協議。常用的雜湊演算法有以下這些。

<1>MD5:MD5即Message-Digest Algorithm 5(資訊-摘要演算法5),用於確保資訊傳輸完整一致。MD5是輸入不定長度資訊,輸出固定長度128bits的演算法。

<2>SHA-1:常用於HTTPS傳輸和軟體簽名。

<3>SHA-2:SHA-224/SHA-256/SHA-384/SHA-512併成為SHA-2

<4>SHA-3:之前名為Keccak演算法,是一個加密雜湊演算法。

5、如何避免雜湊衝突?
通過雜湊函式,我們可以將鍵轉化為陣列的索引(0~M-1),但是對於兩個或者多個鍵具有相同的索引值得情況,我們需要一種處理這種情況的方法。

<1>拉鍊法
如下圖所示,將大小為M的陣列的每一個元素指向一個連結串列,連結串列中的每一個節點都儲存雜湊值為該索引的鍵值對,這個就是拉鍊法。

 

圖中,”John Smith”和”Sandra Dee”通過雜湊函式指向152這個索引,該索引又指向了一個連結串列,在連結串列中依次儲存了這兩個字串。

該方法的基本思想就是選擇足夠大的M,使得所有的連結串列都儘可能的短小,以保證查詢的效率。對採用拉鍊法的雜湊表實現的查詢分為兩步,首先是根據雜湊值找到對應的連結串列,然後沿著連結串列的順序找到相應的鍵。

<2>線性探索法
線性探測法是開放定址法解決雜湊衝突的一種方法,基本原理為,使用大小為M的陣列來儲存N個鍵值對,其中M>N,我們需要使用陣列中的空位來解決碰撞衝突。如下圖所示。

 

對照前面的拉鍊法,在該圖中,”Ted Baker”有唯一雜湊值153的,但是由於153被”Sandra Dee”佔用了。而原先”Sandra Dee”和”John Smith”的雜湊值都是152的,但是在對”Sandra Dee”進行雜湊的是偶發現152已經被佔用了,所以往下找發現153沒有被佔用,就將其存放在153。後面”Ted Baker”雜湊到153上,發現被佔用了,就會往下找,發現154沒有被佔用,所以將其存放到154上面。

開放定址法中最簡單的是線性探測法:當碰撞發生時即一個鍵的雜湊值被另外一個鍵佔用時,直接檢查散列表中下一個位置,即將索引值加1,這樣的線性探測有三種結果:

<1>命中,該位置的鍵個被查詢的鍵相同;

<2>未命中,鍵為空;

<3>繼續查詢,該位置的鍵和被查詢的鍵不同。

那個這兩種方法的效能上面有什麼區別?對於拉鍊法,查詢的效率在於連結串列的長度,一般我們應該保證長度的M/8~M/2之間,如果連結串列的長度大於M/2,我們可以擴充陣列長度。如果長度在0~M/8時,我們可以縮短陣列的長度。對於線性探索法,動態調整陣列的大小需要對所有的值重新進行雜湊並插入新的表中。

不管是拉鍊法還是雜湊法,這種動態調整連結串列或者陣列的大小以提高查詢效率的同時,還應該考慮動態改變連結串列或者陣列大小的成本。散列表長度加倍的插入需要進行大量的探索,這種均攤成本很多時候需要考慮。

6、雜湊碰撞攻擊
我們知道如果雜湊函式選擇不當會使大量的鍵都會對映到相同的索引上,不管是採用拉鍊法還是開放定址法解決衝突,在後面查詢的時候都需要進行多次探測或者查詢,在很多時候會使得雜湊表的查詢效率退化,而不再是常數時間。如下圖描述的那樣。

 

雜湊攻擊就是通過精心構造雜湊函式,使得所有的鍵進過函式函式後都會對映到同一個或者幾個索引上,將雜湊表退化為一個單鏈表,這樣雜湊表的各種操作,比如插入、查詢都會從O(1)退化到了連結串列的查詢操作,這樣會消耗大量的CPU資源,導致系統無法響應,從而達到拒絕服務供給(Denial of Service,DOS)的目的。
————————————————
版權宣告:本文為CSDN博主「走出去拍拍照」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/iva_brother/article/details/82253989