欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實現(xiàn)Hash算法

 更新時間:2022年03月18日 17:27:18   作者:緊到長不胖  
這篇文章主要介紹了基于Python實現(xiàn)Hash算法,最簡單的hash算法是用取余的方式,根據(jù)hash地址存放數(shù)據(jù),這需要提供鍵值對Key地址,value是存放的數(shù)據(jù),下文相關(guān)內(nèi)容需要的小伙伴可以參考一下

1 前言

Simhash的算法簡單的來說就是,從海量文本中快速搜索和已知simhash相差小于k位的simhash集合,這里每個文本都可以用一個simhash值來代表,一個simhash有64bit,相似的文本,64bit也相似,論文中k的經(jīng)驗值為3。該方法的缺點如優(yōu)點一樣明顯,主要有兩點,對于短文本,k值很敏感;另一個是由于算法是以空間換時間,系統(tǒng)內(nèi)存吃不消。

2 一般hash算法

最簡單的hash算法是用取余的方式,根據(jù)hash地址存放數(shù)據(jù),這需要提供鍵值對(Key-value)Key是地址,value是存放的數(shù)據(jù)

2.1 算法邏輯

  • 輸入存放數(shù)據(jù),并建立(Key-value)對象
  • 通過取余數(shù)的方式 公式:哈希地址,d為數(shù)據(jù),具有唯一性,n是樣本總數(shù)
  • 把產(chǎn)生的哈希地址和對應(yīng)數(shù)據(jù)存儲到字典對象中

2.2 代碼實現(xiàn)

# 1.需要記錄的數(shù)據(jù)
records = [[1,50],[2,6],[3,47],[4,8],[5,9],[6,100]] # 數(shù)據(jù)鍵為日期,值為銷售數(shù)量
# 2.定義存放的地址和數(shù)據(jù)
Sadress1 = {'192.168.1.1':1}
Sadress2 = {'192.168.1.2':2}
Sadress3 = {'192.168.1.3':4}
Sadress4 = {'192.168.1.4':6}

# 數(shù)據(jù)長度定義為
n = 20

# 判斷哈希值,分段為0-1-2-4-6
for one in records:
? ? if one[0] % n <= Sadress1['192.168.1.1']:?
? ? ? ? Sadress1[one[0]]=one[1]
? ? elif one[0] % n <= Sadress2['192.168.1.2']:
? ? ? ? Sadress2[one[0]] = one[1]
? ? elif one[0] % n <= Sadress3['192.168.1.3']:
? ? ? ? Sadress3[one[0]] = one[1]
? ? elif one[0] % n <= Sadress4['192.168.1.4']:
? ? ? ? Sadress4[one[0]] = one[1]

print(Sadress1)
print(Sadress2)
print(Sadress3)
print(Sadress4)

2.3 總結(jié)

  • 這是最簡單的Hash算法,還有MD5,SHAI,SHA2
  • 哈希地址沖突,問題主要考慮輸入的唯一性取值方法
  • 在分布式計算中廣泛應(yīng)用

3 一致性hash算法

一致性Hash算法時為了防止單個節(jié)點宕機或者刪除、新增,不會導(dǎo)致數(shù)據(jù)存儲的混亂或者無法儲存。一致性服務(wù)器要求對服務(wù)器地址通過哈希算法也進行映射方式確定輸出地址,再加上對數(shù)據(jù)的哈希處理,一直哈希要實現(xiàn)兩個算法過程。

3.1 算法邏輯

  • 輸入數(shù)據(jù),建立Key-value對象
  • 利用Hash算法產(chǎn)生哈希地址,建立鍵值字典
  • 輸入服務(wù)器地址,利用哈希算法產(chǎn)生哈希地址
  • 數(shù)據(jù)通過地址和服務(wù)器地址,放到對應(yīng)的范圍內(nèi)
  • 輸出

3.2 代碼實現(xiàn)

import hashlib # 導(dǎo)入帶shal()哈希算法的函數(shù)庫
class CHash(object):
? ? def __init__(self,nodes=None,v_num=2):# nodes節(jié)點存放節(jié)點地址,V-num一個節(jié)點對應(yīng),# 默認節(jié)點是為2
? ? ? ? self._v_num = v_num # 一個節(jié)點對應(yīng)存放節(jié)點地址
? ? ? ? self._vNode_IP = {} # 用于虛擬節(jié)點的hash值與node的對應(yīng)關(guān)系
? ? ? ? self._vNodeAdd = [] # 用于存放所有的虛擬節(jié)點的hash值,這里需要保持排序
? ? ? ? for node in nodes:
? ? ? ? ? ? self.addNode(node)
? ? ? ? print('\n虛擬節(jié)點哈希值升序排列:\n',self._vNodeAdd) # 對虛擬節(jié)點哈希地址進行從小到大排序

? ? # 1 建立虛擬節(jié)點環(huán),順序排列
? ? def addNode(self,node):
? ? ? ? for i in range(self._v_num):
? ? ? ? ? ? vNodeStr = '%s%s'%(node ,i) # 根據(jù)虛擬節(jié)點,為每個節(jié)點建立虛擬節(jié)點
? ? ? ? ? ? key = self._gen_key(vNodeStr) # 產(chǎn)生虛擬節(jié)點IP地址,服務(wù)器節(jié)點IP+i
? ? ? ? ? ? print('虛擬節(jié)點字符串',vNodeStr,'對應(yīng)哈希值',key)
? ? ? ? ? ? self._vNode_IP[key] = node # 虛擬節(jié)點哈希地址為鍵,節(jié)點為IP地址為值
? ? ? ? ? ? self._vNodeAdd.append(key) # 對應(yīng)虛擬節(jié)點哈希地址進行獨立儲存
? ? ? ? ? ? self._vNodeAdd.sort()
? ? # 2 刪除退出節(jié)點地址及對應(yīng)的虛擬地址
? ? def Del_Node(self,node): # 刪除退出節(jié)點地址及對應(yīng)的虛擬地址
? ? ? ? for i in range(self._v_num):
? ? ? ? ? ? vNodeStr = '%s%s'%(node,i)
? ? ? ? ? ? key = self._gen_key(vNodeStr) ?# 產(chǎn)生虛擬節(jié)點的哈希地址
? ? ? ? ? ? del self._vNode_IP[key] # 通過哈希地址刪除字典里面的虛擬節(jié)點信息
? ? ? ? ? ? self._vNodeAdd.remove(key) # 刪除虛擬節(jié)點的哈希地址
? ? # 3 返回數(shù)據(jù)儲存對應(yīng)的服務(wù)器地址
? ? def dataNode(self,data):
? ? ? ? if self._vNodeAdd: # 虛擬節(jié)點的哈希地址列表不為空
? ? ? ? ? ? key = self._gen_key(data) # 產(chǎn)生業(yè)務(wù)數(shù)據(jù)對應(yīng)的哈希地址
? ? ? ? ? ? print(data,'哈希地址',key)
? ? ? ? ? ? for node_key in self._vNodeAdd: # 獲取虛擬節(jié)點的哈希地址
? ? ? ? ? ? ? ? if key <= node_key: # 業(yè)務(wù)數(shù)據(jù)的哈希地址<= 當(dāng)前虛擬節(jié)點的哈希地址
? ? ? ? ? ? ? ? ? ? return self._vNode_IP[node_key] # 返回當(dāng)前虛擬節(jié)點哈希地址對應(yīng)節(jié)點IP
? ? ? ? ? ? return self._vNodeAdd[self._vNodeAdd[0]] # 如果業(yè)務(wù)數(shù)據(jù)的哈希值超過所有節(jié)點的地址,則歸入并返回第一個IP地址

? ? ? ? else:
? ? ? ? ? ? return None # 沒有節(jié)點

? ? # 4 通過shal()產(chǎn)生哈希值
? ? @staticmethod # 裝飾器
? ? def _gen_key(key_str):
? ? ? ? Hash_value = hashlib.sha1(key_str.encode('utf-8')).hexdigest()

? ? ? ? return Hash_value

# 測試
C_H = CHash(['192.168.1.1','192.168.1.2','192.168.1.3','192.168.1.4'])
data =['Mike','Margge','Maria']
print('\n正常情況下,存儲數(shù)據(jù)時,歸入的節(jié)點地址:')
print(data[0]+'存入的節(jié)點IP地址:',C_H.dataNode(data[0]))
print(data[1]+'存入的節(jié)點IP地址:',C_H.dataNode(data[1]))
print(data[2]+'存入的節(jié)點IP地址:',C_H.dataNode(data[2]))
# 192.168.2.1刪除節(jié)點
print('\n192.168.1.2節(jié)點脫離分布式系統(tǒng)的情況:')
C_H.Del_Node('192.168.1.2') # 刪除節(jié)點
print(data[0]+'存入的節(jié)點IP地址:',C_H.dataNode(data[0]))
print(data[1]+'存入的節(jié)點IP地址:',C_H.dataNode(data[1]))
print(data[2]+'存入的節(jié)點IP地址:',C_H.dataNode(data[2]))

虛擬節(jié)點字符串 192.168.1.10 對應(yīng)哈希值 f53e4ef74ec8f55440f9caf382c5f63c4a39b4bc
虛擬節(jié)點字符串 192.168.1.11 對應(yīng)哈希值 239b32be446b1288655b570c23ccb51633c03927
虛擬節(jié)點字符串 192.168.1.20 對應(yīng)哈希值 c385b891af246719e1a60c715be2f375aeab0b5b
虛擬節(jié)點字符串 192.168.1.21 對應(yīng)哈希值 0d12ca599dc0316beec6436bb3beb04e84fbe3e2
虛擬節(jié)點字符串 192.168.1.30 對應(yīng)哈希值 265180387f1642217973f8cfda2ca6cc92d48e60
虛擬節(jié)點字符串 192.168.1.31 對應(yīng)哈希值 d6dacbe137bec9a047737207a3a82036f8454362
虛擬節(jié)點字符串 192.168.1.40 對應(yīng)哈希值 7497a9439524d6f044fc22a8723039e0c42bbac8
虛擬節(jié)點字符串 192.168.1.41 對應(yīng)哈希值 89c78508a642956363ed40326fce4346d7889f88

虛擬節(jié)點哈希值升序排列:

 ['0d12ca599dc0316beec6436bb3beb04e84fbe3e2', '239b32be446b1288655b570c23ccb51633c03927', '265180387f1642217973f8cfda2ca6cc92d48e60', '7497a9439524d6f044fc22a8723039e0c42bbac8', '89c78508a642956363ed40326fce4346d7889f88', 'c385b891af246719e1a60c715be2f375aeab0b5b', 'd6dacbe137bec9a047737207a3a82036f8454362', 'f53e4ef74ec8f55440f9caf382c5f63c4a39b4bc']

正常情況下,存儲數(shù)據(jù)時,歸入的節(jié)點地址:

Mike 哈希地址 d6ac022931a66a2bcc244db91818ebec76ce5e18
Mike存入的節(jié)點IP地址: 192.168.1.3
Margge 哈希地址 ae5e1fda577bff360ed5da0b2804a1ff0b2a1675
Margge存入的節(jié)點IP地址: 192.168.1.2
Maria 哈希地址 3e182b1ea9376483a38614d916a0b666ef531b6d
Maria存入的節(jié)點IP地址: 192.168.1.4

192.168.1.2節(jié)點脫離分布式系統(tǒng)的情況:

Mike 哈希地址 d6ac022931a66a2bcc244db91818ebec76ce5e18
Mike存入的節(jié)點IP地址: 192.168.1.3
Margge 哈希地址 ae5e1fda577bff360ed5da0b2804a1ff0b2a1675
Margge存入的節(jié)點IP地址: 192.168.1.3
Maria 哈希地址 3e182b1ea9376483a38614d916a0b666ef531b6d
Maria存入的節(jié)點IP地址: 192.168.1.4

3.3 總結(jié)

  • 應(yīng)用廣泛,很好的解決了服務(wù)器宕機,節(jié)點刪除等問題
  • IP地址指向不同的服務(wù)器訪問地址,為不同的服務(wù)器上的數(shù)據(jù)庫存取提供了便利

到此這篇關(guān)于基于Python實現(xiàn)Hash算法的文章就介紹到這了,更多相關(guān)Python實現(xiàn)Hash算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論