国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

區(qū)塊鏈:哈希算法與一致性哈希算法

這篇具有很好參考價(jià)值的文章主要介紹了區(qū)塊鏈:哈希算法與一致性哈希算法。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本篇主要介紹區(qū)塊鏈中常用到的哈希算法。

1 哈希算法
1.1 定義及特性

??哈希算法是指通過哈希函數(shù)(Hash Function)對任意長度的輸入數(shù)據(jù)(比如文件、消息、數(shù)字等)進(jìn)行轉(zhuǎn)換,生成一個(gè)固定長度的哈希值(Hash Value)的過程。
??在區(qū)塊鏈中,哈希算法常用于區(qū)塊驗(yàn)證及安全性保證。為了保證安全,哈希算法必須滿足以下三個(gè)條件:

  • 抗沖突(collision-resistance): 即不同的輸入不能產(chǎn)生相同的輸出。為了保證哈希算法的抗沖突性,一般會(huì)采用以下幾種方式:將輸入信息盡可能均勻地映射到輸入空間、引入隨機(jī)性、提升計(jì)算復(fù)雜度等。好的哈希算法設(shè)計(jì)能夠大大降低哈希碰撞的概率,提高數(shù)據(jù)的安全性和完整性。
  • 信息隱藏性(information hiding): 即無法通過哈希函數(shù)的輸出反推其輸入。
  • 可隱匿性(puzzle friendly): 即任何微小的輸入變化都會(huì)使得輸出哈希值的分布發(fā)生不可預(yù)測的改變,可以保證攻擊者無法通過改變輸入數(shù)據(jù)的一部分來預(yù)測輸出哈希值的變化情況。
1.2 常用哈希算法

??密碼學(xué)中常用的哈希算法有MD5、SHA1、SHA2、SHA256、SHA512\SHA3、RIPEMD160。這里僅以MD5和SHA1為例展示其Python代碼,如下:

import hashlib

message='今天是2023年7月13號,今年天氣很熱!'

#MD5
md5=hashlib.md5()
md5.update(message.encode('utf-8'))
md5_mess=md5.hexdigest()
print("MD5加密后的內(nèi)容為:{}".format(md5_mess))

#SHA1
sha1=hashlib.sha1()
sha1.update(message.encode('utf-8'))
sha1_mess=sha1.hexdigest()
print("SHA1加密后的內(nèi)容為:{}".format(sha1_mess))

其結(jié)果如下:

MD5加密后的內(nèi)容為:77815d973ce48613428d52956a1f6979
SHA1加密后的內(nèi)容為:572379a7baa62fd26e39bb4bbaf511497dbf838c

2 一致性哈希算法

??一致性哈希算法(Consistent Hashing,CH)是哈希算法的一種擴(kuò)展,主要是為了解決分布式系統(tǒng)中的數(shù)據(jù)分布和負(fù)載均衡問題。

2.1 算法原理

??一致性哈希算法的工作原理如下:

  • 設(shè)置一個(gè)地址空間范圍為 0 ~ ( 2 32 ? 1 ) 0 \sim (2^{32}-1) 0(232?1)的哈希環(huán);
  • 使用節(jié)點(diǎn)的特征值(一般使用節(jié)點(diǎn)ip地址)計(jì)算哈希值,并將該哈希值映射到哈希環(huán)上的某點(diǎn);
  • 對數(shù)據(jù)key使用相同的哈希函數(shù)計(jì)算出哈希值,同樣將其映射到哈希環(huán)上;
  • 從數(shù)據(jù)映射的位置開始順時(shí)針查找,其所遇到的第一個(gè)存儲(chǔ)節(jié)點(diǎn),即為這個(gè)key值所對應(yīng)的存儲(chǔ)節(jié)點(diǎn)地址。

??但當(dāng)哈希環(huán)結(jié)構(gòu)上的存儲(chǔ)節(jié)點(diǎn)較少時(shí),存儲(chǔ)節(jié)點(diǎn)在哈希環(huán)上分配隨機(jī)性較高,導(dǎo)致存儲(chǔ)節(jié)點(diǎn)所承擔(dān)的負(fù)載并不均勻。為了避免這種現(xiàn)象的發(fā)生,引入虛節(jié)點(diǎn)。其思想是將哈希環(huán)的不同位置上放置一個(gè)節(jié)點(diǎn)的多個(gè)拷貝(即虛擬節(jié)點(diǎn),使用真實(shí)節(jié)點(diǎn)對應(yīng)虛擬節(jié)點(diǎn)的特征來計(jì)算哈希值得到虛擬節(jié)點(diǎn)在哈希環(huán)上的位置)。加入虛擬節(jié)點(diǎn)后,key值的映射關(guān)系需要經(jīng)過兩步:

  • 計(jì)算出key值和虛擬節(jié)點(diǎn)的映射關(guān)系;
  • 根據(jù)虛擬節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)的映射關(guān)系找到key值對應(yīng)的真實(shí)存儲(chǔ)節(jié)點(diǎn);
2.2 案例

??使用python代碼模擬使用一致性哈希算法解決分布式數(shù)據(jù)分布的問題。案例代碼如下:

import hashlib

class ConsistentHashing:
    def __init__(self, nodes=None, replica_count=10):
        self.replica_count = replica_count #虛擬節(jié)點(diǎn)的數(shù)量
        self.ring = {} #記錄哈希環(huán)地址及其對應(yīng)的真實(shí)節(jié)點(diǎn)
        self.sorted_keys = []
        if nodes:
            for node in nodes:
                self.add_node(node)
                
    #新節(jié)點(diǎn)加入
    def add_node(self, node):
        for i in range(self.replica_count):
            key = self.get_key(node, i)
            self.ring[key] = node
            self.sorted_keys.append(key)
 
        self.sorted_keys.sort()
        
    #節(jié)點(diǎn)退出
    def remove_node(self, node):
        for i in range(self.replica_count):
            key = self.get_key(node, i)
            del self.ring[key]
            self.sorted_keys.remove(key)
            
    #獲取數(shù)據(jù)內(nèi)容的保存地址
    def get_node(self, data_key):
        if not self.ring:
            return None

        hashed_key = self.hash_key(data_key)
        for key in self.sorted_keys:
            if hashed_key <= key:
                return self.ring[key]

        return self.ring[self.sorted_keys[0]]
    
    #根據(jù)真實(shí)節(jié)點(diǎn)構(gòu)造虛擬節(jié)點(diǎn)的特征值,并用此特征值計(jì)算虛擬節(jié)點(diǎn)在哈希環(huán)上的地址
    def get_key(self, node, replica_index):
        return self.hash_key(f"{node}#{replica_index}")

    #這里使用的哈希函數(shù)為SHA1
    def hash_key(self, key):
        hashed_key = hashlib.sha1(key.encode()).digest()
        return int.from_bytes(hashed_key, byteorder='big')


nodes = ['node1', 'node2', 'node3', 'node4']
CH = ConsistentHashing(nodes=nodes, replica_count=5)

data_keys = ['data1', 'data2', 'data3', 'data4']
for key in data_keys:
    node = CH.get_node(key)
    print(f"'{key}' belongs to '{node}'")

其中一種可能的運(yùn)行結(jié)果如下:

‘data1’ belongs to ‘node1’
‘data2’ belongs to ‘node3’
‘data3’ belongs to ‘node1’
‘data4’ belongs to ‘node2’文章來源地址http://www.zghlxwxcb.cn/news/detail-580967.html

參考資料
  1. 《一致性哈希算法的對比研究》
  2. 《白話區(qū)塊鏈》

到了這里,關(guān)于區(qū)塊鏈:哈希算法與一致性哈希算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 一致性哈希算法優(yōu)勢在哪?如何實(shí)現(xiàn)?

    1.1 簡介Hash 哈希算法即散列算法,是一種從任意文件中創(chuàng)造小的數(shù)字「指紋」的方法。與指紋一樣,散列算法就是一種以較短的信息來保證文件唯一性的標(biāo)志,這種標(biāo)志與文件的每一個(gè)字節(jié)都相關(guān),而且難以找到逆向規(guī)律。因此,當(dāng)原有文件發(fā)生改變時(shí),其標(biāo)志值也會(huì)發(fā)生改

    2024年02月03日
    瀏覽(34)
  • Redis擴(kuò)容機(jī)制與一致性哈希算法解析

    在分布式系統(tǒng)設(shè)計(jì)中,Redis是一個(gè)備受歡迎的內(nèi)存數(shù)據(jù)庫,而一致性哈希算法則是分布式系統(tǒng)中常用的數(shù)據(jù)分片和負(fù)載均衡技術(shù)。本文將深入探討Redis的擴(kuò)容機(jī)制以及一致性哈希算法的原理,同時(shí)提供示例代碼以幫助讀者更好地理解這兩個(gè)重要概念。 Redis是一種高性能的內(nèi)存數(shù)

    2024年02月11日
    瀏覽(42)
  • 什么是一致性哈希?一致性哈希是如何工作的?如何設(shè)計(jì)一致性哈希?

    如果你有 n 個(gè)緩存服務(wù)器,一個(gè)常見的負(fù)載均衡方式是使用以下的哈希方法: 服務(wù)器索引 = 哈希(鍵) % N ,其中 N 是服務(wù)器池的大小。 讓我們通過一個(gè)例子來說明這是如何工作的。如表5-1所示,我們有4臺(tái)服務(wù)器和8個(gè)字符串鍵及其哈希值。 為了獲取存儲(chǔ)某個(gè)鍵的服務(wù)器,我們

    2024年02月06日
    瀏覽(32)
  • Sharding-JDBC 自定義一致性哈希算法 + 虛擬節(jié)點(diǎn) 實(shí)現(xiàn)數(shù)據(jù)庫分片策略

    分片操作是分片鍵 + 分片算法,也就是分片策略。目前Sharding-JDBC 支持多種分片策略: 標(biāo)準(zhǔn)分片策略 對應(yīng)StandardShardingStrategy。提供對SQL語句中的=, IN和BETWEEN AND的分片操作支持。 復(fù)合分片策略 對應(yīng)ComplexShardingStrategy。復(fù)合分片策略。提供對SQL語句中的=, IN和BETWEEN AND的分片操作

    2024年02月02日
    瀏覽(93)
  • 【分布式】一致性哈希和哈希槽

    【分布式】一致性哈希和哈希槽

    當(dāng)我們擁有了多臺(tái)存儲(chǔ)服務(wù)器之后,現(xiàn)在有多個(gè)key,希望可以將這些個(gè)key均勻的緩存到這些服務(wù)器上,可以使用哪些方案呢? 1.1 直接哈希取模 這是一種最容易想到的方法,使用取模算法hash(key)% N,對key進(jìn)行hash運(yùn)算后取模,N是機(jī)器的數(shù)量。key進(jìn)行hash后的結(jié)果對3取模,得

    2024年02月03日
    瀏覽(28)
  • 一致性哈希(哈希環(huán))解決數(shù)據(jù)分布問題

    哈希算法是程序開發(fā)過程中最廣泛接觸到的的算法之一,典型的應(yīng)用有安全加密、數(shù)據(jù)校驗(yàn)、唯一標(biāo)識(shí)、散列函數(shù)、負(fù)載均衡、數(shù)據(jù)分片、分布式存儲(chǔ)。前些天遇到用一致性哈希(哈希環(huán))的場景,不過我細(xì)想一下,對這個(gè)知識(shí)點(diǎn)好像了解過,但是又沒太深印象,說不出具體

    2024年02月04日
    瀏覽(27)
  • Dubbo負(fù)載均衡策略之 一致性哈希

    Dubbo負(fù)載均衡策略之 一致性哈希

    本文主要講解了一致性哈希算法的原理以及其存在的數(shù)據(jù)傾斜的問題,然后引出解決數(shù)據(jù)傾斜問題的方法,最后分析一致性哈希算法在Dubbo中的使用。通過這篇文章,可以了解到一致性哈希算法的原理以及這種算法存在的問題和解決方案。 在這里引用dubbo官網(wǎng)的一段話——

    2024年02月08日
    瀏覽(23)
  • 得物面試:Redis用哈希槽,而不是一致性哈希,為什么?

    得物面試:Redis用哈希槽,而不是一致性哈希,為什么?

    在40歲老架構(gòu)師 尼恩的 讀者交流群 (50+)中,最近有小伙伴拿到了一線互聯(lián)網(wǎng)企業(yè)如得物、阿里、滴滴、極兔、有贊、希音、百度、網(wǎng)易、美團(tuán)的面試資格,遇到很多很重要的面試題: Redis為何用哈希槽而不用一致性哈希? 最近有小伙伴在面試網(wǎng)易,又遇到了相關(guān)的面試題。

    2024年02月21日
    瀏覽(24)
  • Dubbo負(fù)載均衡策略之 一致性哈希 | 京東云技術(shù)團(tuán)隊(duì)

    Dubbo負(fù)載均衡策略之 一致性哈希 | 京東云技術(shù)團(tuán)隊(duì)

    本文主要講解了一致性哈希算法的原理以及其存在的數(shù)據(jù)傾斜的問題,然后引出解決數(shù)據(jù)傾斜問題的方法,最后分析一致性哈希算法在Dubbo中的使用。通過這篇文章,可以了解到一致性哈希算法的原理以及這種算法存在的問題和解決方案。 在這里引用dubbo官網(wǎng)的一段話——

    2024年02月08日
    瀏覽(27)
  • JAVA面試題分享五百六十五:為啥Redis用哈希槽,不用一致性哈希?

    JAVA面試題分享五百六十五:為啥Redis用哈希槽,不用一致性哈希?

    無論是哈希槽,還是一致性hash,都屬于hash取模數(shù)據(jù)分片。 先從經(jīng)典的hash取模數(shù)據(jù)分片說起 假如 Redis集群的節(jié)點(diǎn)數(shù)為3個(gè),使用經(jīng)典的hash取模算法進(jìn)行數(shù)據(jù)分片,實(shí)際上就是一個(gè)節(jié)點(diǎn)一個(gè)數(shù)據(jù)分片,分為3片而已。 每次請求使用 hash(key) % 3 的方式計(jì)算對應(yīng)的節(jié)點(diǎn),或者進(jìn)行

    2024年04月16日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包