主頁 >  其他 > 2022 演算法的考量 一文讀懂哈希和一致性哈希演算法

2022 演算法的考量 一文讀懂哈希和一致性哈希演算法

2022-04-29 07:45:00 其他

尊重原創著作權: https://www.gewuweb.com/hot/10544.html

一文讀懂哈希和一致性哈希演算法

尊重原創著作權: https://www.gewuweb.com/sitemap.html

一文讀懂哈希和一致性哈希演算法

哈希 Hash 演算法介紹

哈希演算法也叫散列演算法, 不過英文單詞都是 Hash, 簡單一句話概括, 就是可以把任意長度的輸入資訊通過演算法變換成固定長度的輸出資訊,
輸出資訊也就是哈希值, 通常哈希值的格式是16進制或者是10進制, 比如下面的使用 md5 哈希演算法的示例

md5("123456") => "e10adc3949ba59abbe56e057f20f883e"

主要特點:

  • 不可逆 從哈希值不能推匯出原始資料, 所以Hash演算法廣泛應用在現代密碼體系中
  • 無碰撞 不同的資訊進行哈希后得到的值應該是不同的, 但是從理論上來說, 哈希演算法其實是有可能發生碰撞的, 輸入的資訊是無窮的, 而輸出的哈希值長度是固定的, 所以是有限的,好比要把10個蘋果放到9個抽屜里面, 肯定會有一個抽屜裝了多個蘋果, 只不過哈希演算法的碰撞的概率是非常小的, 比如128位的哈希值, 就有2的128次方的空間,
  • 效率高 在處理比較大的原生值時, 也能能快速的計算出哈希值
  • 無規律 原始輸入資訊修改一點資訊, 得到的哈希值也是大不相同的

哈希演算法的實作有很多, 常見的有 MD5, SHA-1, 還有像 C#, Java 一些語言都有直接的 GetHashCode(), hashCode()
函式可以直接來用,

分布式存盤場景

在互聯網場景中, 通常面對的都是海量的資料,海量的用戶, 那為了要滿足大量資料的寫入和查詢, 以及高可用, 一臺單機的存盤服務器肯定是不能滿足需求的,
通常需要使用多臺服務器形成分布式存盤,

** 場景描述: **

在本文中, 為了方便大家更好的理解, 這里列出了一個簡單的例子, 有三位用戶, 分別是 James、 Bob、 Lee,
我們需要把用戶的圖片寫入到存盤服務器節點, 這里有ABC三個節點, 而且當查詢用戶的圖片時, 還需要快速定位到這個用戶的圖片是在哪個節點存盤的,
然后直接從這個節點進行查詢, 需要滿足高效率的查詢,

一文讀懂哈希和一致性哈希演算法

** 實作思路: **

首先,我們可以對用戶標識進行 Hash 計算, 這里我為了方便演示, 使用了用戶名作為Hash物件, 當然你還可以對用戶的IP或者是UserId
進行Hash計算, Hash計算后會生成一個int型別的數字, 然后再根據存盤節點的數量進行取模, 這里的公式就是 ** hash(name) % 3
** , 計算得出的結果只有三種情況, 分別是 0,1,2, 然后我們再把這三種結果和三個存盤節點做一個映射, 0 ==> A, 1 ==> B, 2 ==
C, 因為Hash演算法對一個值多次計算后都會得到同樣的hash值, 所以上面的公式, 一個用戶的圖片每次都會固定的寫入的其中一個節點, 這樣做查詢的話,
也可以通過hash演算法快速找到這個用戶的圖片所在的節點,

一文讀懂哈希和一致性哈希演算法

** 缺點: **

上面我們使用Hash演算法實作了負載均衡, 可以根據用戶名路由到圖片所在的節點, 但是上面的方法也有一個很大的缺點, 那就是當服務器的數量增加或者減少時,
我們通過Hash演算法生成的路由規則就再不準確了,

試想一下, 如果新增或者減少一個節點, 上面的公式就會變成 ** hash(name) % 4 ** 或者 ** hash(name) % 2 **
, 這里的關鍵點是, 我們之前用3取模, 現在變成用4或者2取模, 結果當然大概率是不一樣了, 當然如果
Hash后是12的話,用3或者4取模得到的結果都是為0, 不過這種概率比較小,

這個問題帶來的影響是, 路由規則不再準確, 大部分的查詢請求都撲了空,那么如何解決這個問題呢?相信有的同學這時應該有了一些想法, 是的沒錯, 關鍵點就在于,
不管節點的數量怎么變化, 都應該使用一個固定的值來進行取模! 只有這樣才能保證每次進行Hash計算后, 得出的結果是不變的!

一致性Hash演算法

同樣的,一致性Hash演算法也是利用取模的方式, 不過通常是用一個很大的數字進行求模, 你可以用整數的最大值 int.Max, 2的32次方,
當然這個并沒有要求, 不過越大的數字, 平均分配的概率就越大(后面會具體介紹這個問題),

為了方便理解, 這里我用 1000 來取模, 我們可以用一個長度為1000的陣串列示它,就像這樣

一文讀懂哈希和一致性哈希演算法

接下來, 我們先不對用戶的圖片進行Hash處理, 而是先對每個節點進行 Hash 處理和映射, 現在的公式分別是 hash(A) % 1000 ,
hash(B) % 1000 , hash(C) % 1000 , 這樣得出的結果一定是在0-999 之間, 然后把這個值映射到陣列中, 在代碼中,
你可以用一個字典集合來保存這個映射關系,

對應的存盤節點和陣列的映射可能如下:

一文讀懂哈希和一致性哈希演算法

那現在用戶的圖片怎么和存盤節點對應呢? 因為存盤節點已經映射到了陣列上, 我們現在可以通過范圍區間的方式, 來找到對應的節點,
映射在陣列上的圖片可以向右查找, 找到了一個節點, 那么這個圖片就屬于這個節點, 當往右查找到最大值時,再回到最左邊從0開始,

我在圖中用不同的顏色標記了每個存盤服務器的范圍區間, 你可以理解一下

一文讀懂哈希和一致性哈希演算法

接下來, 我們就需要對用戶的圖片進行Hash計算取模,同樣的,計算結果一定還是在0-999的范圍內, 然后再把這些值映射到陣列上, 映射的結果可能如下圖:

一文讀懂哈希和一致性哈希演算法

這樣就可以通過往右查找的方式, 找到用戶的圖片相對應的存盤節點! 總結下來上面做了幾件事情, 首先我們取一個固定的并且比較大的整數進行求模,
然后在對每個節點進行Hash計算求模, 這樣可以找出每個節點所對應的范圍區間, 最后再把用戶的圖片進行Hash計算求模,
最后根據范圍區間確定圖片的所在的存盤節點,

那我們看看使用了這種方式, 當存盤節點的增加和減少時會有什么影響?

** 節點增加場景 **

一文讀懂哈希和一致性哈希演算法

這里我新增了一個存盤節點D, 經過Hash計算后映射在陣列上, 這樣的話, 用戶 James 本來是路由到C節點的,現在被路由到了D節點,
不過我們添加了D節點后, 受到影響的也只有C節點, 其實不管D節點映射到陣列哪一個位置, 都只會有一個節點會受到影響, 其他的節點可以正常使用,

那么這種情況下, 如何做資料遷移? 我的思路是, 我們需要把C節點全部資料重新進行Hash計算, 然后根據計算結果, 一部分會移動到D節點,
一部分繼續保留在C節點,

** 節點減少場景 **

一文讀懂哈希和一致性哈希演算法

假如現在 A 節點在晚上20點宕機了, 那么本來應該路由到A節點的資料, 現在就被路由到了節點C, 也就是圖中的 Bob的資料, 但是這種情況下,
其他的節點是不會受到節點變動的影響, 等到晚上21點時, A節點又恢復了正常,

這種情況的資料遷移的思路是, 當A節點宕機后, 資料需要全部復制到C節點, 當A節點恢復正常后, 再把C節點20:00至21:00的資料重新Hash計算,
然后根據計算的結果, 一部分會移動到A節點, 一部分繼續保留在C節點,

** 節點分布不均勻 **

因為節點是隨機的散列分布在陣列上,所以有的節點的范圍比較大, 而有的節點的范圍比較小, 這樣我們的資料分布就不均勻, 有的節點服務器會有比較大的請求壓力,

這種情況有的同學可能會說, 我可以根據陣列的長度(1000)和節點(3)的個數, 求出平均值, 然后就可以平均的把節點散列到陣列上,
這樣每個節點的請求壓力都是一樣的, 這種方式看起來沒什么問題, 但是當添加節點或者移除節點的時候, 每個節點的覆寫范圍都需要重新計算, 然后也需要遷移資料,
影響的范圍還是挺大的,

一文讀懂哈希和一致性哈希演算法

虛擬節點

一文讀懂哈希和一致性哈希演算法

之前我們用了三個存盤節點, 發現有分布不均勻的情況, 上圖是我做了一個簡單的測驗, x 軸是節點的數量, y 軸是標準偏差, 根據這個圖的趨勢得出的結論是,
節點越多的時候, 標準偏差也就越小, 節點分布的就越均勻,

實際中,服務器節點是有限的, 增加很多節點也肯定是不現實的, 那么就可以在服務器節點不變的情況下, 引入虛擬節點, 也叫做影子節點,

一文讀懂哈希和一致性哈希演算法

還記得我們之前是怎么對節點做hash映射的嗎?公式是 hash(node) / 1000, 我們現在可以給A節點創建10個虛擬節點, 分別是 A1,
A2,A3..., A10, 對應的虛擬節點的公式就是 hash(A1) / 1000 等等,這些虛擬節點和真實節點存在映射關系,
當圖片映射到A節點的任意一個虛擬節點上時, 我們就把這個圖片路由到A存盤節點, 現在陣列上已經有了30個虛擬節點做映射, 分布也比之前更均勻了,
當然你也可以創建更多的虛擬節點, 這些真實節點和虛擬節點的映射關系要保存在記憶體中或者是資料庫中, 現在我們的映射圖如下,
這里我給每個真實節點都添加了3個虛擬節點,

一文讀懂哈希和一致性哈希演算法

引入了虛擬節點后, 在陣列的映射看起來平均很多了, 現在我們每個真實節點的請求壓力都是一樣的了, 接下來,
我們還要看下這個方案在節點的變動情況下應該怎么處理,

** 增加節點 **

現在增加了一個節點D,按照上面的規則, 實際上是要添加 D 的虛擬節點, D1,D2,D3,然后散列映射到陣列上,如下圖所示:

一文讀懂哈希和一致性哈希演算法

先看最左邊, D1 插入到了 C2 和 A1 之間, 而A1和A節點對應, D1節點和D節點對應, 也就是說A節點的一部分資料要遷移到D節點,
這里我的思路是, 當在節點寫入資料時, 同時把虛擬節點的資訊也記錄下來,這樣就很方便做資料遷移了, 我們可以在A節點中只找出A1虛擬節點的資料,
而不是全部, 然后Hash計算映射后, 根據計算結果,一部分同步到D節點, 一部分保持不變,后邊的資料也可以按照這個思路進行資料遷移,

** 節點減少 **

一文讀懂哈希和一致性哈希演算法

當C節點下線的時候, 我們同時要移除和C節點對應的虛擬節點,C1,C2,C3, 然后就是資料遷移的作業了, 根據圖中的表示, 可以直接把
C節點中的C2節點的資料遷移到A1節點, C1遷移到B3,C3遷移到B1中, 完成!

總結

本文介紹了哈希和一致性哈希演算法, 以及提供了一些資料遷移的思路, 回顧下這個方案, 首先需要定義一個比較大的固定值用于取模,
然后創建和真實節點對應的虛擬節點, 最后再把虛擬節點映射到陣列上, 通過范圍區間的方法, 來確定圖片屬于哪一個存盤節點,

可能還有同學會說, 一致性hash也有快取失效的時候,也需要手動遷移資料, 是的, 維基百科對一致性Hash的定義是,
當節點的數量變動時,可以允許少部分的資料進行遷移, 而大部分的資料還是不變的,

上面的一致性Hash演算法其實是經典的哈希環演算法, 當然還有其他的演算法, 比如跳躍一致性哈希法, 有興趣也可以看一下, 以上內容均為個人理解, 如果錯誤,
可以指出, 希望對您有用!

出, 希望對您有用!

尊重原創著作權: https://www.gewuweb.com/sitemap.html

尊重原創著作權: https://www.gewuweb.com/hot/13427.html

一文讀懂哈希和一致性哈希演算法

一文讀懂哈希和一致性哈希演算法

哈希 Hash 演算法介紹

哈希演算法也叫散列演算法, 不過英文單詞都是 Hash, 簡單一句話概括, 就是可以把任意長度的輸入資訊通過演算法變換成固定長度的輸出資訊,
輸出資訊也就是哈希值, 通常哈希值的格式是16進制或者是10進制, 比如下面的使用 md5 哈希演算法的示例

md5("123456") => "e10adc3949ba59abbe56e057f20f883e"

主要特點:

  • 不可逆 從哈希值不能推匯出原始資料, 所以Hash演算法廣泛應用在現代密碼體系中
  • 無碰撞 不同的資訊進行哈希后得到的值應該是不同的, 但是從理論上來說, 哈希演算法其實是有可能發生碰撞的, 輸入的資訊是無窮的, 而輸出的哈希值長度是固定的, 所以是有限的,好比要把10個蘋果放到9個抽屜里面, 肯定會有一個抽屜裝了多個蘋果, 只不過哈希演算法的碰撞的概率是非常小的, 比如128位的哈希值, 就有2的128次方的空間,
  • 效率高 在處理比較大的原生值時, 也能能快速的計算出哈希值
  • 無規律 原始輸入資訊修改一點資訊, 得到的哈希值也是大不相同的

哈希演算法的實作有很多, 常見的有 MD5, SHA-1, 還有像 C#, Java 一些語言都有直接的 GetHashCode(), hashCode()
函式可以直接來用,

分布式存盤場景

在互聯網場景中, 通常面對的都是海量的資料,海量的用戶, 那為了要滿足大量資料的寫入和查詢, 以及高可用, 一臺單機的存盤服務器肯定是不能滿足需求的,
通常需要使用多臺服務器形成分布式存盤,

** 場景描述: **

在本文中, 為了方便大家更好的理解, 這里列出了一個簡單的例子, 有三位用戶, 分別是 James、 Bob、 Lee,
我們需要把用戶的圖片寫入到存盤服務器節點, 這里有ABC三個節點, 而且當查詢用戶的圖片時, 還需要快速定位到這個用戶的圖片是在哪個節點存盤的,
然后直接從這個節點進行查詢, 需要滿足高效率的查詢,

一文讀懂哈希和一致性哈希演算法

** 實作思路: **

首先,我們可以對用戶標識進行 Hash 計算, 這里我為了方便演示, 使用了用戶名作為Hash物件, 當然你還可以對用戶的IP或者是UserId
進行Hash計算, Hash計算后會生成一個int型別的數字, 然后再根據存盤節點的數量進行取模, 這里的公式就是 ** hash(name) % 3
** , 計算得出的結果只有三種情況, 分別是 0,1,2, 然后我們再把這三種結果和三個存盤節點做一個映射, 0 ==> A, 1 ==> B, 2 ==
C, 因為Hash演算法對一個值多次計算后都會得到同樣的hash值, 所以上面的公式, 一個用戶的圖片每次都會固定的寫入的其中一個節點, 這樣做查詢的話,
也可以通過hash演算法快速找到這個用戶的圖片所在的節點,

一文讀懂哈希和一致性哈希演算法

** 缺點: **

上面我們使用Hash演算法實作了負載均衡, 可以根據用戶名路由到圖片所在的節點, 但是上面的方法也有一個很大的缺點, 那就是當服務器的數量增加或者減少時,
我們通過Hash演算法生成的路由規則就再不準確了,

試想一下, 如果新增或者減少一個節點, 上面的公式就會變成 ** hash(name) % 4 ** 或者 ** hash(name) % 2 **
, 這里的關鍵點是, 我們之前用3取模, 現在變成用4或者2取模, 結果當然大概率是不一樣了, 當然如果
Hash后是12的話,用3或者4取模得到的結果都是為0, 不過這種概率比較小,

這個問題帶來的影響是, 路由規則不再準確, 大部分的查詢請求都撲了空,那么如何解決這個問題呢?相信有的同學這時應該有了一些想法, 是的沒錯, 關鍵點就在于,
不管節點的數量怎么變化, 都應該使用一個固定的值來進行取模! 只有這樣才能保證每次進行Hash計算后, 得出的結果是不變的!

一致性Hash演算法

同樣的,一致性Hash演算法也是利用取模的方式, 不過通常是用一個很大的數字進行求模, 你可以用整數的最大值 int.Max, 2的32次方,
當然這個并沒有要求, 不過越大的數字, 平均分配的概率就越大(后面會具體介紹這個問題),

為了方便理解, 這里我用 1000 來取模, 我們可以用一個長度為1000的陣串列示它,就像這樣

一文讀懂哈希和一致性哈希演算法

接下來, 我們先不對用戶的圖片進行Hash處理, 而是先對每個節點進行 Hash 處理和映射, 現在的公式分別是 hash(A) % 1000 ,
hash(B) % 1000 , hash(C) % 1000 , 這樣得出的結果一定是在0-999 之間, 然后把這個值映射到陣列中, 在代碼中,
你可以用一個字典集合來保存這個映射關系,

對應的存盤節點和陣列的映射可能如下:

一文讀懂哈希和一致性哈希演算法

那現在用戶的圖片怎么和存盤節點對應呢? 因為存盤節點已經映射到了陣列上, 我們現在可以通過范圍區間的方式, 來找到對應的節點,
映射在陣列上的圖片可以向右查找, 找到了一個節點, 那么這個圖片就屬于這個節點, 當往右查找到最大值時,再回到最左邊從0開始,

我在圖中用不同的顏色標記了每個存盤服務器的范圍區間, 你可以理解一下

一文讀懂哈希和一致性哈希演算法

接下來, 我們就需要對用戶的圖片進行Hash計算取模,同樣的,計算結果一定還是在0-999的范圍內, 然后再把這些值映射到陣列上, 映射的結果可能如下圖:

一文讀懂哈希和一致性哈希演算法

這樣就可以通過往右查找的方式, 找到用戶的圖片相對應的存盤節點! 總結下來上面做了幾件事情, 首先我們取一個固定的并且比較大的整數進行求模,
然后在對每個節點進行Hash計算求模, 這樣可以找出每個節點所對應的范圍區間, 最后再把用戶的圖片進行Hash計算求模,
最后根據范圍區間確定圖片的所在的存盤節點,

那我們看看使用了這種方式, 當存盤節點的增加和減少時會有什么影響?

** 節點增加場景 **

一文讀懂哈希和一致性哈希演算法

這里我新增了一個存盤節點D, 經過Hash計算后映射在陣列上, 這樣的話, 用戶 James 本來是路由到C節點的,現在被路由到了D節點,
不過我們添加了D節點后, 受到影響的也只有C節點, 其實不管D節點映射到陣列哪一個位置, 都只會有一個節點會受到影響, 其他的節點可以正常使用,

那么這種情況下, 如何做資料遷移? 我的思路是, 我們需要把C節點全部資料重新進行Hash計算, 然后根據計算結果, 一部分會移動到D節點,
一部分繼續保留在C節點,

** 節點減少場景 **

一文讀懂哈希和一致性哈希演算法

假如現在 A 節點在晚上20點宕機了, 那么本來應該路由到A節點的資料, 現在就被路由到了節點C, 也就是圖中的 Bob的資料, 但是這種情況下,
其他的節點是不會受到節點變動的影響, 等到晚上21點時, A節點又恢復了正常,

這種情況的資料遷移的思路是, 當A節點宕機后, 資料需要全部復制到C節點, 當A節點恢復正常后, 再把C節點20:00至21:00的資料重新Hash計算,
然后根據計算的結果, 一部分會移動到A節點, 一部分繼續保留在C節點,

** 節點分布不均勻 **

因為節點是隨機的散列分布在陣列上,所以有的節點的范圍比較大, 而有的節點的范圍比較小, 這樣我們的資料分布就不均勻, 有的節點服務器會有比較大的請求壓力,

這種情況有的同學可能會說, 我可以根據陣列的長度(1000)和節點(3)的個數, 求出平均值, 然后就可以平均的把節點散列到陣列上,
這樣每個節點的請求壓力都是一樣的, 這種方式看起來沒什么問題, 但是當添加節點或者移除節點的時候, 每個節點的覆寫范圍都需要重新計算, 然后也需要遷移資料,
影響的范圍還是挺大的,

一文讀懂哈希和一致性哈希演算法

虛擬節點

一文讀懂哈希和一致性哈希演算法

之前我們用了三個存盤節點, 發現有分布不均勻的情況, 上圖是我做了一個簡單的測驗, x 軸是節點的數量, y 軸是標準偏差, 根據這個圖的趨勢得出的結論是,
節點越多的時候, 標準偏差也就越小, 節點分布的就越均勻,

實際中,服務器節點是有限的, 增加很多節點也肯定是不現實的, 那么就可以在服務器節點不變的情況下, 引入虛擬節點, 也叫做影子節點,

一文讀懂哈希和一致性哈希演算法

還記得我們之前是怎么對節點做hash映射的嗎?公式是 hash(node) / 1000, 我們現在可以給A節點創建10個虛擬節點, 分別是 A1,
A2,A3..., A10, 對應的虛擬節點的公式就是 hash(A1) / 1000 等等,這些虛擬節點和真實節點存在映射關系,
當圖片映射到A節點的任意一個虛擬節點上時, 我們就把這個圖片路由到A存盤節點, 現在陣列上已經有了30個虛擬節點做映射, 分布也比之前更均勻了,
當然你也可以創建更多的虛擬節點, 這些真實節點和虛擬節點的映射關系要保存在記憶體中或者是資料庫中, 現在我們的映射圖如下,
這里我給每個真實節點都添加了3個虛擬節點,

一文讀懂哈希和一致性哈希演算法

引入了虛擬節點后, 在陣列的映射看起來平均很多了, 現在我們每個真實節點的請求壓力都是一樣的了, 接下來,
我們還要看下這個方案在節點的變動情況下應該怎么處理,

** 增加節點 **

現在增加了一個節點D,按照上面的規則, 實際上是要添加 D 的虛擬節點, D1,D2,D3,然后散列映射到陣列上,如下圖所示:

一文讀懂哈希和一致性哈希演算法

先看最左邊, D1 插入到了 C2 和 A1 之間, 而A1和A節點對應, D1節點和D節點對應, 也就是說A節點的一部分資料要遷移到D節點,
這里我的思路是, 當在節點寫入資料時, 同時把虛擬節點的資訊也記錄下來,這樣就很方便做資料遷移了, 我們可以在A節點中只找出A1虛擬節點的資料,
而不是全部, 然后Hash計算映射后, 根據計算結果,一部分同步到D節點, 一部分保持不變,后邊的資料也可以按照這個思路進行資料遷移,

** 節點減少 **

一文讀懂哈希和一致性哈希演算法

當C節點下線的時候, 我們同時要移除和C節點對應的虛擬節點,C1,C2,C3, 然后就是資料遷移的作業了, 根據圖中的表示, 可以直接把
C節點中的C2節點的資料遷移到A1節點, C1遷移到B3,C3遷移到B1中, 完成!

總結

本文介紹了哈希和一致性哈希演算法, 以及提供了一些資料遷移的思路, 回顧下這個方案, 首先需要定義一個比較大的固定值用于取模,
然后創建和真實節點對應的虛擬節點, 最后再把虛擬節點映射到陣列上, 通過范圍區間的方法, 來確定圖片屬于哪一個存盤節點,

可能還有同學會說, 一致性hash也有快取失效的時候,也需要手動遷移資料, 是的, 維基百科對一致性Hash的定義是,
當節點的數量變動時,可以允許少部分的資料進行遷移, 而大部分的資料還是不變的,

上面的一致性Hash演算法其實是經典的哈希環演算法, 當然還有其他的演算法, 比如跳躍一致性哈希法, 有興趣也可以看一下, 以上內容均為個人理解, 如果錯誤,
可以指出, 希望對您有用!

出, 希望對您有用!

尊重原創著作權: https://www.gewuweb.com/sitemap.html

尊重原創著作權: https://www.gewuweb.com/hot/14285.html

一文讀懂哈希和一致性哈希演算法

一文讀懂哈希和一致性哈希演算法

哈希 Hash 演算法介紹

哈希演算法也叫散列演算法, 不過英文單詞都是 Hash, 簡單一句話概括, 就是可以把任意長度的輸入資訊通過演算法變換成固定長度的輸出資訊,
輸出資訊也就是哈希值, 通常哈希值的格式是16進制或者是10進制, 比如下面的使用 md5 哈希演算法的示例

md5("123456") => "e10adc3949ba59abbe56e057f20f883e"

主要特點:

  • 不可逆 從哈希值不能推匯出原始資料, 所以Hash演算法廣泛應用在現代密碼體系中
  • 無碰撞 不同的資訊進行哈希后得到的值應該是不同的, 但是從理論上來說, 哈希演算法其實是有可能發生碰撞的, 輸入的資訊是無窮的, 而輸出的哈希值長度是固定的, 所以是有限的,好比要把10個蘋果放到9個抽屜里面, 肯定會有一個抽屜裝了多個蘋果, 只不過哈希演算法的碰撞的概率是非常小的, 比如128位的哈希值, 就有2的128次方的空間,
  • 效率高 在處理比較大的原生值時, 也能能快速的計算出哈希值
  • 無規律 原始輸入資訊修改一點資訊, 得到的哈希值也是大不相同的

哈希演算法的實作有很多, 常見的有 MD5, SHA-1, 還有像 C#, Java 一些語言都有直接的 GetHashCode(), hashCode()
函式可以直接來用,

分布式存盤場景

在互聯網場景中, 通常面對的都是海量的資料,海量的用戶, 那為了要滿足大量資料的寫入和查詢, 以及高可用, 一臺單機的存盤服務器肯定是不能滿足需求的,
通常需要使用多臺服務器形成分布式存盤,

** 場景描述: **

在本文中, 為了方便大家更好的理解, 這里列出了一個簡單的例子, 有三位用戶, 分別是 James、 Bob、 Lee,
我們需要把用戶的圖片寫入到存盤服務器節點, 這里有ABC三個節點, 而且當查詢用戶的圖片時, 還需要快速定位到這個用戶的圖片是在哪個節點存盤的,
然后直接從這個節點進行查詢, 需要滿足高效率的查詢,

一文讀懂哈希和一致性哈希演算法

** 實作思路: **

首先,我們可以對用戶標識進行 Hash 計算, 這里我為了方便演示, 使用了用戶名作為Hash物件, 當然你還可以對用戶的IP或者是UserId
進行Hash計算, Hash計算后會生成一個int型別的數字, 然后再根據存盤節點的數量進行取模, 這里的公式就是 ** hash(name) % 3
** , 計算得出的結果只有三種情況, 分別是 0,1,2, 然后我們再把這三種結果和三個存盤節點做一個映射, 0 ==> A, 1 ==> B, 2 ==
C, 因為Hash演算法對一個值多次計算后都會得到同樣的hash值, 所以上面的公式, 一個用戶的圖片每次都會固定的寫入的其中一個節點, 這樣做查詢的話,
也可以通過hash演算法快速找到這個用戶的圖片所在的節點,

一文讀懂哈希和一致性哈希演算法

** 缺點: **

上面我們使用Hash演算法實作了負載均衡, 可以根據用戶名路由到圖片所在的節點, 但是上面的方法也有一個很大的缺點, 那就是當服務器的數量增加或者減少時,
我們通過Hash演算法生成的路由規則就再不準確了,

試想一下, 如果新增或者減少一個節點, 上面的公式就會變成 ** hash(name) % 4 ** 或者 ** hash(name) % 2 **
, 這里的關鍵點是, 我們之前用3取模, 現在變成用4或者2取模, 結果當然大概率是不一樣了, 當然如果
Hash后是12的話,用3或者4取模得到的結果都是為0, 不過這種概率比較小,

這個問題帶來的影響是, 路由規則不再準確, 大部分的查詢請求都撲了空,那么如何解決這個問題呢?相信有的同學這時應該有了一些想法, 是的沒錯, 關鍵點就在于,
不管節點的數量怎么變化, 都應該使用一個固定的值來進行取模! 只有這樣才能保證每次進行Hash計算后, 得出的結果是不變的!

一致性Hash演算法

同樣的,一致性Hash演算法也是利用取模的方式, 不過通常是用一個很大的數字進行求模, 你可以用整數的最大值 int.Max, 2的32次方,
當然這個并沒有要求, 不過越大的數字, 平均分配的概率就越大(后面會具體介紹這個問題),

為了方便理解, 這里我用 1000 來取模, 我們可以用一個長度為1000的陣串列示它,就像這樣

一文讀懂哈希和一致性哈希演算法

接下來, 我們先不對用戶的圖片進行Hash處理, 而是先對每個節點進行 Hash 處理和映射, 現在的公式分別是 hash(A) % 1000 ,
hash(B) % 1000 , hash(C) % 1000 , 這樣得出的結果一定是在0-999 之間, 然后把這個值映射到陣列中, 在代碼中,
你可以用一個字典集合來保存這個映射關系,

對應的存盤節點和陣列的映射可能如下:

一文讀懂哈希和一致性哈希演算法

那現在用戶的圖片怎么和存盤節點對應呢? 因為存盤節點已經映射到了陣列上, 我們現在可以通過范圍區間的方式, 來找到對應的節點,
映射在陣列上的圖片可以向右查找, 找到了一個節點, 那么這個圖片就屬于這個節點, 當往右查找到最大值時,再回到最左邊從0開始,

我在圖中用不同的顏色標記了每個存盤服務器的范圍區間, 你可以理解一下

一文讀懂哈希和一致性哈希演算法

接下來, 我們就需要對用戶的圖片進行Hash計算取模,同樣的,計算結果一定還是在0-999的范圍內, 然后再把這些值映射到陣列上, 映射的結果可能如下圖:

一文讀懂哈希和一致性哈希演算法

這樣就可以通過往右查找的方式, 找到用戶的圖片相對應的存盤節點! 總結下來上面做了幾件事情, 首先我們取一個固定的并且比較大的整數進行求模,
然后在對每個節點進行Hash計算求模, 這樣可以找出每個節點所對應的范圍區間, 最后再把用戶的圖片進行Hash計算求模,
最后根據范圍區間確定圖片的所在的存盤節點,

那我們看看使用了這種方式, 當存盤節點的增加和減少時會有什么影響?

** 節點增加場景 **

一文讀懂哈希和一致性哈希演算法

這里我新增了一個存盤節點D, 經過Hash計算后映射在陣列上, 這樣的話, 用戶 James 本來是路由到C節點的,現在被路由到了D節點,
不過我們添加了D節點后, 受到影響的也只有C節點, 其實不管D節點映射到陣列哪一個位置, 都只會有一個節點會受到影響, 其他的節點可以正常使用,

那么這種情況下, 如何做資料遷移? 我的思路是, 我們需要把C節點全部資料重新進行Hash計算, 然后根據計算結果, 一部分會移動到D節點,
一部分繼續保留在C節點,

** 節點減少場景 **

一文讀懂哈希和一致性哈希演算法

假如現在 A 節點在晚上20點宕機了, 那么本來應該路由到A節點的資料, 現在就被路由到了節點C, 也就是圖中的 Bob的資料, 但是這種情況下,
其他的節點是不會受到節點變動的影響, 等到晚上21點時, A節點又恢復了正常,

這種情況的資料遷移的思路是, 當A節點宕機后, 資料需要全部復制到C節點, 當A節點恢復正常后, 再把C節點20:00至21:00的資料重新Hash計算,
然后根據計算的結果, 一部分會移動到A節點, 一部分繼續保留在C節點,

** 節點分布不均勻 **

因為節點是隨機的散列分布在陣列上,所以有的節點的范圍比較大, 而有的節點的范圍比較小, 這樣我們的資料分布就不均勻, 有的節點服務器會有比較大的請求壓力,

這種情況有的同學可能會說, 我可以根據陣列的長度(1000)和節點(3)的個數, 求出平均值, 然后就可以平均的把節點散列到陣列上,
這樣每個節點的請求壓力都是一樣的, 這種方式看起來沒什么問題, 但是當添加節點或者移除節點的時候, 每個節點的覆寫范圍都需要重新計算, 然后也需要遷移資料,
影響的范圍還是挺大的,

一文讀懂哈希和一致性哈希演算法

虛擬節點

一文讀懂哈希和一致性哈希演算法

之前我們用了三個存盤節點, 發現有分布不均勻的情況, 上圖是我做了一個簡單的測驗, x 軸是節點的數量, y 軸是標準偏差, 根據這個圖的趨勢得出的結論是,
節點越多的時候, 標準偏差也就越小, 節點分布的就越均勻,

實際中,服務器節點是有限的, 增加很多節點也肯定是不現實的, 那么就可以在服務器節點不變的情況下, 引入虛擬節點, 也叫做影子節點,

一文讀懂哈希和一致性哈希演算法

還記得我們之前是怎么對節點做hash映射的嗎?公式是 hash(node) / 1000, 我們現在可以給A節點創建10個虛擬節點, 分別是 A1,
A2,A3..., A10, 對應的虛擬節點的公式就是 hash(A1) / 1000 等等,這些虛擬節點和真實節點存在映射關系,
當圖片映射到A節點的任意一個虛擬節點上時, 我們就把這個圖片路由到A存盤節點, 現在陣列上已經有了30個虛擬節點做映射, 分布也比之前更均勻了,
當然你也可以創建更多的虛擬節點, 這些真實節點和虛擬節點的映射關系要保存在記憶體中或者是資料庫中, 現在我們的映射圖如下,
這里我給每個真實節點都添加了3個虛擬節點,

一文讀懂哈希和一致性哈希演算法

引入了虛擬節點后, 在陣列的映射看起來平均很多了, 現在我們每個真實節點的請求壓力都是一樣的了, 接下來,
我們還要看下這個方案在節點的變動情況下應該怎么處理,

** 增加節點 **

現在增加了一個節點D,按照上面的規則, 實際上是要添加 D 的虛擬節點, D1,D2,D3,然后散列映射到陣列上,如下圖所示:

一文讀懂哈希和一致性哈希演算法

先看最左邊, D1 插入到了 C2 和 A1 之間, 而A1和A節點對應, D1節點和D節點對應, 也就是說A節點的一部分資料要遷移到D節點,
這里我的思路是, 當在節點寫入資料時, 同時把虛擬節點的資訊也記錄下來,這樣就很方便做資料遷移了, 我們可以在A節點中只找出A1虛擬節點的資料,
而不是全部, 然后Hash計算映射后, 根據計算結果,一部分同步到D節點, 一部分保持不變,后邊的資料也可以按照這個思路進行資料遷移,

** 節點減少 **

一文讀懂哈希和一致性哈希演算法

當C節點下線的時候, 我們同時要移除和C節點對應的虛擬節點,C1,C2,C3, 然后就是資料遷移的作業了, 根據圖中的表示, 可以直接把
C節點中的C2節點的資料遷移到A1節點, C1遷移到B3,C3遷移到B1中, 完成!

總結

本文介紹了哈希和一致性哈希演算法, 以及提供了一些資料遷移的思路, 回顧下這個方案, 首先需要定義一個比較大的固定值用于取模,
然后創建和真實節點對應的虛擬節點, 最后再把虛擬節點映射到陣列上, 通過范圍區間的方法, 來確定圖片屬于哪一個存盤節點,

可能還有同學會說, 一致性hash也有快取失效的時候,也需要手動遷移資料, 是的, 維基百科對一致性Hash的定義是,
當節點的數量變動時,可以允許少部分的資料進行遷移, 而大部分的資料還是不變的,

上面的一致性Hash演算法其實是經典的哈希環演算法, 當然還有其他的演算法, 比如跳躍一致性哈希法, 有興趣也可以看一下, 以上內容均為個人理解, 如果錯誤,
可以指出, 希望對您有用!

出, 希望對您有用!

尊重原創著作權: https://www.gewuweb.com/sitemap.html

尊重原創著作權: https://www.gewuweb.com/hot/14635.html

一文讀懂哈希和一致性哈希演算法

一文讀懂哈希和一致性哈希演算法

哈希 Hash 演算法介紹

哈希演算法也叫散列演算法, 不過英文單詞都是 Hash, 簡單一句話概括, 就是可以把任意長度的輸入資訊通過演算法變換成固定長度的輸出資訊,
輸出資訊也就是哈希值, 通常哈希值的格式是16進制或者是10進制, 比如下面的使用 md5 哈希演算法的示例

md5("123456") => "e10adc3949ba59abbe56e057f20f883e"

主要特點:

  • 不可逆 從哈希值不能推匯出原始資料, 所以Hash演算法廣泛應用在現代密碼體系中
  • 無碰撞 不同的資訊進行哈希后得到的值應該是不同的, 但是從理論上來說, 哈希演算法其實是有可能發生碰撞的, 輸入的資訊是無窮的, 而輸出的哈希值長度是固定的, 所以是有限的,好比要把10個蘋果放到9個抽屜里面, 肯定會有一個抽屜裝了多個蘋果, 只不過哈希演算法的碰撞的概率是非常小的, 比如128位的哈希值, 就有2的128次方的空間,
  • 效率高 在處理比較大的原生值時, 也能能快速的計算出哈希值
  • 無規律 原始輸入資訊修改一點資訊, 得到的哈希值也是大不相同的

哈希演算法的實作有很多, 常見的有 MD5, SHA-1, 還有像 C#, Java 一些語言都有直接的 GetHashCode(), hashCode()
函式可以直接來用,

分布式存盤場景

在互聯網場景中, 通常面對的都是海量的資料,海量的用戶, 那為了要滿足大量資料的寫入和查詢, 以及高可用, 一臺單機的存盤服務器肯定是不能滿足需求的,
通常需要使用多臺服務器形成分布式存盤,

** 場景描述: **

在本文中, 為了方便大家更好的理解, 這里列出了一個簡單的例子, 有三位用戶, 分別是 James、 Bob、 Lee,
我們需要把用戶的圖片寫入到存盤服務器節點, 這里有ABC三個節點, 而且當查詢用戶的圖片時, 還需要快速定位到這個用戶的圖片是在哪個節點存盤的,
然后直接從這個節點進行查詢, 需要滿足高效率的查詢,

一文讀懂哈希和一致性哈希演算法

** 實作思路: **

首先,我們可以對用戶標識進行 Hash 計算, 這里我為了方便演示, 使用了用戶名作為Hash物件, 當然你還可以對用戶的IP或者是UserId
進行Hash計算, Hash計算后會生成一個int型別的數字, 然后再根據存盤節點的數量進行取模, 這里的公式就是 ** hash(name) % 3
** , 計算得出的結果只有三種情況, 分別是 0,1,2, 然后我們再把這三種結果和三個存盤節點做一個映射, 0 ==> A, 1 ==> B, 2 ==
C, 因為Hash演算法對一個值多次計算后都會得到同樣的hash值, 所以上面的公式, 一個用戶的圖片每次都會固定的寫入的其中一個節點, 這樣做查詢的話,
也可以通過hash演算法快速找到這個用戶的圖片所在的節點,

一文讀懂哈希和一致性哈希演算法

** 缺點: **

上面我們使用Hash演算法實作了負載均衡, 可以根據用戶名路由到圖片所在的節點, 但是上面的方法也有一個很大的缺點, 那就是當服務器的數量增加或者減少時,
我們通過Hash演算法生成的路由規則就再不準確了,

試想一下, 如果新增或者減少一個節點, 上面的公式就會變成 ** hash(name) % 4 ** 或者 ** hash(name) % 2 **
, 這里的關鍵點是, 我們之前用3取模, 現在變成用4或者2取模, 結果當然大概率是不一樣了, 當然如果
Hash后是12的話,用3或者4取模得到的結果都是為0, 不過這種概率比較小,

這個問題帶來的影響是, 路由規則不再準確, 大部分的查詢請求都撲了空,那么如何解決這個問題呢?相信有的同學這時應該有了一些想法, 是的沒錯, 關鍵點就在于,
不管節點的數量怎么變化, 都應該使用一個固定的值來進行取模! 只有這樣才能保證每次進行Hash計算后, 得出的結果是不變的!

一致性Hash演算法

同樣的,一致性Hash演算法也是利用取模的方式, 不過通常是用一個很大的數字進行求模, 你可以用整數的最大值 int.Max, 2的32次方,
當然這個并沒有要求, 不過越大的數字, 平均分配的概率就越大(后面會具體介紹這個問題),

為了方便理解, 這里我用 1000 來取模, 我們可以用一個長度為1000的陣串列示它,就像這樣

一文讀懂哈希和一致性哈希演算法

接下來, 我們先不對用戶的圖片進行Hash處理, 而是先對每個節點進行 Hash 處理和映射, 現在的公式分別是 hash(A) % 1000 ,
hash(B) % 1000 , hash(C) % 1000 , 這樣得出的結果一定是在0-999 之間, 然后把這個值映射到陣列中, 在代碼中,
你可以用一個字典集合來保存這個映射關系,

對應的存盤節點和陣列的映射可能如下:

一文讀懂哈希和一致性哈希演算法

那現在用戶的圖片怎么和存盤節點對應呢? 因為存盤節點已經映射到了陣列上, 我們現在可以通過范圍區間的方式, 來找到對應的節點,
映射在陣列上的圖片可以向右查找, 找到了一個節點, 那么這個圖片就屬于這個節點, 當往右查找到最大值時,再回到最左邊從0開始,

我在圖中用不同的顏色標記了每個存盤服務器的范圍區間, 你可以理解一下

一文讀懂哈希和一致性哈希演算法

接下來, 我們就需要對用戶的圖片進行Hash計算取模,同樣的,計算結果一定還是在0-999的范圍內, 然后再把這些值映射到陣列上, 映射的結果可能如下圖:

一文讀懂哈希和一致性哈希演算法

這樣就可以通過往右查找的方式, 找到用戶的圖片相對應的存盤節點! 總結下來上面做了幾件事情, 首先我們取一個固定的并且比較大的整數進行求模,
然后在對每個節點進行Hash計算求模, 這樣可以找出每個節點所對應的范圍區間, 最后再把用戶的圖片進行Hash計算求模,
最后根據范圍區間確定圖片的所在的存盤節點,

那我們看看使用了這種方式, 當存盤節點的增加和減少時會有什么影響?

** 節點增加場景 **

一文讀懂哈希和一致性哈希演算法

這里我新增了一個存盤節點D, 經過Hash計算后映射在陣列上, 這樣的話, 用戶 James 本來是路由到C節點的,現在被路由到了D節點,
不過我們添加了D節點后, 受到影響的也只有C節點, 其實不管D節點映射到陣列哪一個位置, 都只會有一個節點會受到影響, 其他的節點可以正常使用,

那么這種情況下, 如何做資料遷移? 我的思路是, 我們需要把C節點全部資料重新進行Hash計算, 然后根據計算結果, 一部分會移動到D節點,
一部分繼續保留在C節點,

** 節點減少場景 **

一文讀懂哈希和一致性哈希演算法

假如現在 A 節點在晚上20點宕機了, 那么本來應該路由到A節點的資料, 現在就被路由到了節點C, 也就是圖中的 Bob的資料, 但是這種情況下,
其他的節點是不會受到節點變動的影響, 等到晚上21點時, A節點又恢復了正常,

這種情況的資料遷移的思路是, 當A節點宕機后, 資料需要全部復制到C節點, 當A節點恢復正常后, 再把C節點20:00至21:00的資料重新Hash計算,
然后根據計算的結果, 一部分會移動到A節點, 一部分繼續保留在C節點,

** 節點分布不均勻 **

因為節點是隨機的散列分布在陣列上,所以有的節點的范圍比較大, 而有的節點的范圍比較小, 這樣我們的資料分布就不均勻, 有的節點服務器會有比較大的請求壓力,

這種情況有的同學可能會說, 我可以根據陣列的長度(1000)和節點(3)的個數, 求出平均值, 然后就可以平均的把節點散列到陣列上,
這樣每個節點的請求壓力都是一樣的, 這種方式看起來沒什么問題, 但是當添加節點或者移除節點的時候, 每個節點的覆寫范圍都需要重新計算, 然后也需要遷移資料,
影響的范圍還是挺大的,

一文讀懂哈希和一致性哈希演算法

虛擬節點

一文讀懂哈希和一致性哈希演算法

之前我們用了三個存盤節點, 發現有分布不均勻的情況, 上圖是我做了一個簡單的測驗, x 軸是節點的數量, y 軸是標準偏差, 根據這個圖的趨勢得出的結論是,
節點越多的時候, 標準偏差也就越小, 節點分布的就越均勻,

實際中,服務器節點是有限的, 增加很多節點也肯定是不現實的, 那么就可以在服務器節點不變的情況下, 引入虛擬節點, 也叫做影子節點,

一文讀懂哈希和一致性哈希演算法

還記得我們之前是怎么對節點做hash映射的嗎?公式是 hash(node) / 1000, 我們現在可以給A節點創建10個虛擬節點, 分別是 A1,
A2,A3..., A10, 對應的虛擬節點的公式就是 hash(A1) / 1000 等等,這些虛擬節點和真實節點存在映射關系,
當圖片映射到A節點的任意一個虛擬節點上時, 我們就把這個圖片路由到A存盤節點, 現在陣列上已經有了30個虛擬節點做映射, 分布也比之前更均勻了,
當然你也可以創建更多的虛擬節點, 這些真實節點和虛擬節點的映射關系要保存在記憶體中或者是資料庫中, 現在我們的映射圖如下,
這里我給每個真實節點都添加了3個虛擬節點,

一文讀懂哈希和一致性哈希演算法

引入了虛擬節點后, 在陣列的映射看起來平均很多了, 現在我們每個真實節點的請求壓力都是一樣的了, 接下來,
我們還要看下這個方案在節點的變動情況下應該怎么處理,

** 增加節點 **

現在增加了一個節點D,按照上面的規則, 實際上是要添加 D 的虛擬節點, D1,D2,D3,然后散列映射到陣列上,如下圖所示:

一文讀懂哈希和一致性哈希演算法

先看最左邊, D1 插入到了 C2 和 A1 之間, 而A1和A節點對應, D1節點和D節點對應, 也就是說A節點的一部分資料要遷移到D節點,
這里我的思路是, 當在節點寫入資料時, 同時把虛擬節點的資訊也記錄下來,這樣就很方便做資料遷移了, 我們可以在A節點中只找出A1虛擬節點的資料,
而不是全部, 然后Hash計算映射后, 根據計算結果,一部分同步到D節點, 一部分保持不變,后邊的資料也可以按照這個思路進行資料遷移,

** 節點減少 **

一文讀懂哈希和一致性哈希演算法

當C節點下線的時候, 我們同時要移除和C節點對應的虛擬節點,C1,C2,C3, 然后就是資料遷移的作業了, 根據圖中的表示, 可以直接把
C節點中的C2節點的資料遷移到A1節點, C1遷移到B3,C3遷移到B1中, 完成!

總結

本文介紹了哈希和一致性哈希演算法, 以及提供了一些資料遷移的思路, 回顧下這個方案, 首先需要定義一個比較大的固定值用于取模,
然后創建和真實節點對應的虛擬節點, 最后再把虛擬節點映射到陣列上, 通過范圍區間的方法, 來確定圖片屬于哪一個存盤節點,

可能還有同學會說, 一致性hash也有快取失效的時候,也需要手動遷移資料, 是的, 維基百科對一致性Hash的定義是,
當節點的數量變動時,可以允許少部分的資料進行遷移, 而大部分的資料還是不變的,

上面的一致性Hash演算法其實是經典的哈希環演算法, 當然還有其他的演算法, 比如跳躍一致性哈希法, 有興趣也可以看一下, 以上內容均為個人理解, 如果錯誤,
可以指出, 希望對您有用!

出, 希望對您有用!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/466991.html

標籤:其他

上一篇:【Pyrosim】 surface deposition 設定

下一篇:【Unity】UI面板:倒計時器

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more