中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Python如何實現Hash算法

發布時間:2022-03-19 09:04:02 來源:億速云 閱讀:245 作者:iii 欄目:開發技術

本篇內容主要講解“基于Python如何實現Hash算法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“基于Python如何實現Hash算法”吧!

1 前言

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

2 一般hash算法

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

2.1 算法邏輯

  • 輸入存放數據,并建立(Key-value)對象

  • 通過取余數的方式 公式H = d H=d%nH=d H:哈希地址,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

到此,相信大家對“基于Python如何實現Hash算法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

寿阳县| 盐边县| 景泰县| 凤庆县| 唐海县| 府谷县| 聊城市| 呼伦贝尔市| 苏尼特右旗| 邯郸县| 内乡县| 石景山区| 商南县| 永春县| 垫江县| 包头市| 兰考县| 沐川县| 万全县| 长子县| 苍南县| 靖安县| 永修县| 平武县| 清远市| 罗山县| 涡阳县| 花莲县| 剑阁县| 云霄县| 凌海市| 甘肃省| 龙口市| 津南区| 湖南省| 通河县| 托里县| 青岛市| 申扎县| 龙江县| 五莲县|