網站首頁 編程語言 正文
1 前言
Simhash
的算法簡單的來說就是,從海量文本中快速搜索和已知simhash相差小于k位的simhash集合,這里每個文本都可以用一個simhash值來代表,一個simhash有64bit,相似的文本,64bit也相似,論文中k的經驗值為3。該方法的缺點如優點一樣明顯,主要有兩點,對于短文本,k值很敏感;另一個是由于算法是以空間換時間,系統內存吃不消。
2 一般hash算法
最簡單的hash算法是用取余的方式,根據hash地址存放數據,這需要提供鍵值對(Key-value)Key是地址,value是存放的數據
2.1 算法邏輯
- 輸入存放數據,并建立(Key-value)對象
- 通過取余數的方式 公式
:哈希地址,d為數據,具有唯一性,n是樣本總數
- 把產生的哈希地址和對應數據存儲到字典對象中
2.2 代碼實現
# 1.需要記錄的數據 records = [[1,50],[2,6],[3,47],[4,8],[5,9],[6,100]] # 數據鍵為日期,值為銷售數量 # 2.定義存放的地址和數據 Sadress1 = {'192.168.1.1':1} Sadress2 = {'192.168.1.2':2} Sadress3 = {'192.168.1.3':4} Sadress4 = {'192.168.1.4':6} # 數據長度定義為 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 總結
- 這是最簡單的Hash算法,還有MD5,SHAI,SHA2
- 哈希地址沖突,問題主要考慮輸入的唯一性取值方法
- 在分布式計算中廣泛應用
3 一致性hash算法
一致性Hash算法時為了防止單個節點宕機或者刪除、新增,不會導致數據存儲的混亂或者無法儲存。一致性服務器要求對服務器地址通過哈希算法也進行映射方式確定輸出地址,再加上對數據的哈希處理,一直哈希要實現兩個算法過程。
3.1 算法邏輯
- 輸入數據,建立Key-value對象
- 利用Hash算法產生哈希地址,建立鍵值字典
- 輸入服務器地址,利用哈希算法產生哈希地址
- 數據通過地址和服務器地址,放到對應的范圍內
- 輸出
3.2 代碼實現
import hashlib # 導入帶shal()哈希算法的函數庫 class CHash(object): ? ? def __init__(self,nodes=None,v_num=2):# nodes節點存放節點地址,V-num一個節點對應,# 默認節點是為2 ? ? ? ? self._v_num = v_num # 一個節點對應存放節點地址 ? ? ? ? self._vNode_IP = {} # 用于虛擬節點的hash值與node的對應關系 ? ? ? ? self._vNodeAdd = [] # 用于存放所有的虛擬節點的hash值,這里需要保持排序 ? ? ? ? for node in nodes: ? ? ? ? ? ? self.addNode(node) ? ? ? ? print('\n虛擬節點哈希值升序排列:\n',self._vNodeAdd) # 對虛擬節點哈希地址進行從小到大排序 ? ? # 1 建立虛擬節點環,順序排列 ? ? def addNode(self,node): ? ? ? ? for i in range(self._v_num): ? ? ? ? ? ? vNodeStr = '%s%s'%(node ,i) # 根據虛擬節點,為每個節點建立虛擬節點 ? ? ? ? ? ? key = self._gen_key(vNodeStr) # 產生虛擬節點IP地址,服務器節點IP+i ? ? ? ? ? ? print('虛擬節點字符串',vNodeStr,'對應哈希值',key) ? ? ? ? ? ? self._vNode_IP[key] = node # 虛擬節點哈希地址為鍵,節點為IP地址為值 ? ? ? ? ? ? self._vNodeAdd.append(key) # 對應虛擬節點哈希地址進行獨立儲存 ? ? ? ? ? ? self._vNodeAdd.sort() ? ? # 2 刪除退出節點地址及對應的虛擬地址 ? ? def Del_Node(self,node): # 刪除退出節點地址及對應的虛擬地址 ? ? ? ? for i in range(self._v_num): ? ? ? ? ? ? vNodeStr = '%s%s'%(node,i) ? ? ? ? ? ? key = self._gen_key(vNodeStr) ?# 產生虛擬節點的哈希地址 ? ? ? ? ? ? del self._vNode_IP[key] # 通過哈希地址刪除字典里面的虛擬節點信息 ? ? ? ? ? ? self._vNodeAdd.remove(key) # 刪除虛擬節點的哈希地址 ? ? # 3 返回數據儲存對應的服務器地址 ? ? def dataNode(self,data): ? ? ? ? if self._vNodeAdd: # 虛擬節點的哈希地址列表不為空 ? ? ? ? ? ? key = self._gen_key(data) # 產生業務數據對應的哈希地址 ? ? ? ? ? ? print(data,'哈希地址',key) ? ? ? ? ? ? for node_key in self._vNodeAdd: # 獲取虛擬節點的哈希地址 ? ? ? ? ? ? ? ? if key <= node_key: # 業務數據的哈希地址<= 當前虛擬節點的哈希地址 ? ? ? ? ? ? ? ? ? ? return self._vNode_IP[node_key] # 返回當前虛擬節點哈希地址對應節點IP ? ? ? ? ? ? return self._vNodeAdd[self._vNodeAdd[0]] # 如果業務數據的哈希值超過所有節點的地址,則歸入并返回第一個IP地址 ? ? ? ? else: ? ? ? ? ? ? return None # 沒有節點 ? ? # 4 通過shal()產生哈希值 ? ? @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正常情況下,存儲數據時,歸入的節點地址:') print(data[0]+'存入的節點IP地址:',C_H.dataNode(data[0])) print(data[1]+'存入的節點IP地址:',C_H.dataNode(data[1])) print(data[2]+'存入的節點IP地址:',C_H.dataNode(data[2])) # 192.168.2.1刪除節點 print('\n192.168.1.2節點脫離分布式系統的情況:') C_H.Del_Node('192.168.1.2') # 刪除節點 print(data[0]+'存入的節點IP地址:',C_H.dataNode(data[0])) print(data[1]+'存入的節點IP地址:',C_H.dataNode(data[1])) print(data[2]+'存入的節點IP地址:',C_H.dataNode(data[2]))
虛擬節點字符串 192.168.1.10 對應哈希值 f53e4ef74ec8f55440f9caf382c5f63c4a39b4bc
虛擬節點字符串 192.168.1.11 對應哈希值 239b32be446b1288655b570c23ccb51633c03927
虛擬節點字符串 192.168.1.20 對應哈希值 c385b891af246719e1a60c715be2f375aeab0b5b
虛擬節點字符串 192.168.1.21 對應哈希值 0d12ca599dc0316beec6436bb3beb04e84fbe3e2
虛擬節點字符串 192.168.1.30 對應哈希值 265180387f1642217973f8cfda2ca6cc92d48e60
虛擬節點字符串 192.168.1.31 對應哈希值 d6dacbe137bec9a047737207a3a82036f8454362
虛擬節點字符串 192.168.1.40 對應哈希值 7497a9439524d6f044fc22a8723039e0c42bbac8
虛擬節點字符串 192.168.1.41 對應哈希值 89c78508a642956363ed40326fce4346d7889f88
虛擬節點哈希值升序排列:
?['0d12ca599dc0316beec6436bb3beb04e84fbe3e2', '239b32be446b1288655b570c23ccb51633c03927', '265180387f1642217973f8cfda2ca6cc92d48e60', '7497a9439524d6f044fc22a8723039e0c42bbac8', '89c78508a642956363ed40326fce4346d7889f88', 'c385b891af246719e1a60c715be2f375aeab0b5b', 'd6dacbe137bec9a047737207a3a82036f8454362', 'f53e4ef74ec8f55440f9caf382c5f63c4a39b4bc']
正常情況下,存儲數據時,歸入的節點地址:
Mike 哈希地址 d6ac022931a66a2bcc244db91818ebec76ce5e18
Mike存入的節點IP地址: 192.168.1.3
Margge 哈希地址 ae5e1fda577bff360ed5da0b2804a1ff0b2a1675
Margge存入的節點IP地址: 192.168.1.2
Maria 哈希地址 3e182b1ea9376483a38614d916a0b666ef531b6d
Maria存入的節點IP地址: 192.168.1.4
192.168.1.2節點脫離分布式系統的情況:
Mike 哈希地址 d6ac022931a66a2bcc244db91818ebec76ce5e18
Mike存入的節點IP地址: 192.168.1.3
Margge 哈希地址 ae5e1fda577bff360ed5da0b2804a1ff0b2a1675
Margge存入的節點IP地址: 192.168.1.3
Maria 哈希地址 3e182b1ea9376483a38614d916a0b666ef531b6d
Maria存入的節點IP地址: 192.168.1.4
3.3 總結
- 應用廣泛,很好的解決了服務器宕機,節點刪除等問題
- IP地址指向不同的服務器訪問地址,為不同的服務器上的數據庫存取提供了便利
原文鏈接:https://blog.csdn.net/weixin_43213884/article/details/123563099
相關推薦
- 2022-05-31 python中三種輸出格式總結(%,format,f-string)_python
- 2023-12-09 出現錯誤:SLF4J: Class path contains multiple SLF4J bin
- 2023-06-17 Python構建區塊鏈的方法詳解_python
- 2023-03-23 詳解python?ThreadPoolExecutor異常捕獲_python
- 2022-08-01 flask-SQLALchemy連接數據庫的實現示例_python
- 2022-11-30 GoLang?channel底層代碼分析詳解_Golang
- 2022-11-23 詳解如何使用Pytorch進行多卡訓練_python
- 2022-07-14 React父子組件傳值(組件通信)的實現方法_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支