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

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

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

1 前言

Simhash的算法簡單的來說就是,從海量文本中快速搜索和已知simhash相差小于k位的simhash集合,這里每個(gè)文本都可以用一個(gè)simhash值來代表,一個(gè)simhash有64bit,相似的文本,64bit也相似,論文中k的經(jīng)驗(yàn)值為3。該方法的缺點(diǎn)如優(yōu)點(diǎn)一樣明顯,主要有兩點(diǎn),對于短文本,k值很敏感;另一個(gè)是由于算法是以空間換時(shí)間,系統(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ù)存儲(chǔ)到字典對象中

2.2 代碼實(shí)現(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
  • 哈希地址沖突,問題主要考慮輸入的唯一性取值方法
  • 在分布式計(jì)算中廣泛應(yīng)用

3 一致性hash算法

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

3.1 算法邏輯

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

3.2 代碼實(shí)現(xiàn)

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

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

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

? ? # 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正常情況下,存儲(chǔ)數(shù)據(jù)時(shí),歸入的節(jié)點(diǎn)地址:')
print(data[0]+'存入的節(jié)點(diǎn)IP地址:',C_H.dataNode(data[0]))
print(data[1]+'存入的節(jié)點(diǎn)IP地址:',C_H.dataNode(data[1]))
print(data[2]+'存入的節(jié)點(diǎn)IP地址:',C_H.dataNode(data[2]))
# 192.168.2.1刪除節(jié)點(diǎn)
print('\n192.168.1.2節(jié)點(diǎn)脫離分布式系統(tǒng)的情況:')
C_H.Del_Node('192.168.1.2') # 刪除節(jié)點(diǎn)
print(data[0]+'存入的節(jié)點(diǎn)IP地址:',C_H.dataNode(data[0]))
print(data[1]+'存入的節(jié)點(diǎn)IP地址:',C_H.dataNode(data[1]))
print(data[2]+'存入的節(jié)點(diǎn)IP地址:',C_H.dataNode(data[2]))

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

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

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

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

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

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

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

3.3 總結(jié)

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

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

相關(guān)文章

最新評論