区块链:哈希算法与一致性哈希算法

这篇具有很好参考价值的文章主要介绍了区块链:哈希算法与一致性哈希算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇主要介绍区块链中常用到的哈希算法。

1 哈希算法
1.1 定义及特性

  哈希算法是指通过哈希函数(Hash Function)对任意长度的输入数据(比如文件、消息、数字等)进行转换,生成一个固定长度的哈希值(Hash Value)的过程。
  在区块链中,哈希算法常用于区块验证及安全性保证。为了保证安全,哈希算法必须满足以下三个条件:

  • 抗冲突(collision-resistance): 即不同的输入不能产生相同的输出。为了保证哈希算法的抗冲突性,一般会采用以下几种方式:将输入信息尽可能均匀地映射到输入空间、引入随机性、提升计算复杂度等。好的哈希算法设计能够大大降低哈希碰撞的概率,提高数据的安全性和完整性。
  • 信息隐藏性(information hiding): 即无法通过哈希函数的输出反推其输入。
  • 可隐匿性(puzzle friendly): 即任何微小的输入变化都会使得输出哈希值的分布发生不可预测的改变,可以保证攻击者无法通过改变输入数据的一部分来预测输出哈希值的变化情况。
1.2 常用哈希算法

  密码学中常用的哈希算法有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加密后的内容为:{}".format(md5_mess))

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

其结果如下:

MD5加密后的内容为:77815d973ce48613428d52956a1f6979
SHA1加密后的内容为:572379a7baa62fd26e39bb4bbaf511497dbf838c

2 一致性哈希算法

  一致性哈希算法(Consistent Hashing,CH)是哈希算法的一种扩展,主要是为了解决分布式系统中的数据分布和负载均衡问题。

2.1 算法原理

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

  • 设置一个地址空间范围为 0 ∼ ( 2 32 − 1 ) 0 \sim (2^{32}-1) 0(2321)的哈希环;
  • 使用节点的特征值(一般使用节点ip地址)计算哈希值,并将该哈希值映射到哈希环上的某点;
  • 对数据key使用相同的哈希函数计算出哈希值,同样将其映射到哈希环上;
  • 从数据映射的位置开始顺时针查找,其所遇到的第一个存储节点,即为这个key值所对应的存储节点地址。

  但当哈希环结构上的存储节点较少时,存储节点在哈希环上分配随机性较高,导致存储节点所承担的负载并不均匀。为了避免这种现象的发生,引入虚节点。其思想是将哈希环的不同位置上放置一个节点的多个拷贝(即虚拟节点,使用真实节点对应虚拟节点的特征来计算哈希值得到虚拟节点在哈希环上的位置)。加入虚拟节点后,key值的映射关系需要经过两步:

  • 计算出key值和虚拟节点的映射关系;
  • 根据虚拟节点和存储节点的映射关系找到key值对应的真实存储节点;
2.2 案例

  使用python代码模拟使用一致性哈希算法解决分布式数据分布的问题。案例代码如下:

import hashlib

class ConsistentHashing:
    def __init__(self, nodes=None, replica_count=10):
        self.replica_count = replica_count #虚拟节点的数量
        self.ring = {} #记录哈希环地址及其对应的真实节点
        self.sorted_keys = []
        if nodes:
            for node in nodes:
                self.add_node(node)
                
    #新节点加入
    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()
        
    #节点退出
    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)
            
    #获取数据内容的保存地址
    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]]
    
    #根据真实节点构造虚拟节点的特征值,并用此特征值计算虚拟节点在哈希环上的地址
    def get_key(self, node, replica_index):
        return self.hash_key(f"{node}#{replica_index}")

    #这里使用的哈希函数为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}'")

其中一种可能的运行结果如下:

‘data1’ belongs to ‘node1’
‘data2’ belongs to ‘node3’
‘data3’ belongs to ‘node1’
‘data4’ belongs to ‘node2’文章来源地址https://www.toymoban.com/news/detail-580967.html

参考资料
  1. 《一致性哈希算法的对比研究》
  2. 《白话区块链》

到了这里,关于区块链:哈希算法与一致性哈希算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一致性哈希算法优势在哪?如何实现?

    1.1 简介Hash 哈希算法即散列算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改

    2024年02月03日
    浏览(55)
  • Redis扩容机制与一致性哈希算法解析

    在分布式系统设计中,Redis是一个备受欢迎的内存数据库,而一致性哈希算法则是分布式系统中常用的数据分片和负载均衡技术。本文将深入探讨Redis的扩容机制以及一致性哈希算法的原理,同时提供示例代码以帮助读者更好地理解这两个重要概念。 Redis是一种高性能的内存数

    2024年02月11日
    浏览(47)
  • 什么是一致性哈希?一致性哈希是如何工作的?如何设计一致性哈希?

    如果你有 n 个缓存服务器,一个常见的负载均衡方式是使用以下的哈希方法: 服务器索引 = 哈希(键) % N ,其中 N 是服务器池的大小。 让我们通过一个例子来说明这是如何工作的。如表5-1所示,我们有4台服务器和8个字符串键及其哈希值。 为了获取存储某个键的服务器,我们

    2024年02月06日
    浏览(62)
  • Sharding-JDBC 自定义一致性哈希算法 + 虚拟节点 实现数据库分片策略

    分片操作是分片键 + 分片算法,也就是分片策略。目前Sharding-JDBC 支持多种分片策略: 标准分片策略 对应StandardShardingStrategy。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。 复合分片策略 对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作

    2024年02月02日
    浏览(64)
  • 【分布式】一致性哈希和哈希槽

    当我们拥有了多台存储服务器之后,现在有多个key,希望可以将这些个key均匀的缓存到这些服务器上,可以使用哪些方案呢? 1.1 直接哈希取模 这是一种最容易想到的方法,使用取模算法hash(key)% N,对key进行hash运算后取模,N是机器的数量。key进行hash后的结果对3取模,得

    2024年02月03日
    浏览(49)
  • 一致性哈希(哈希环)解决数据分布问题

    哈希算法是程序开发过程中最广泛接触到的的算法之一,典型的应用有安全加密、数据校验、唯一标识、散列函数、负载均衡、数据分片、分布式存储。前些天遇到用一致性哈希(哈希环)的场景,不过我细想一下,对这个知识点好像了解过,但是又没太深印象,说不出具体

    2024年02月04日
    浏览(54)
  • Dubbo负载均衡策略之 一致性哈希

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 在这里引用dubbo官网的一段话——

    2024年02月08日
    浏览(66)
  • 得物面试:Redis用哈希槽,而不是一致性哈希,为什么?

    在40岁老架构师 尼恩的 读者交流群 (50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: Redis为何用哈希槽而不用一致性哈希? 最近有小伙伴在面试网易,又遇到了相关的面试题。

    2024年02月21日
    浏览(58)
  • Dubbo负载均衡策略之 一致性哈希 | 京东云技术团队

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 在这里引用dubbo官网的一段话——

    2024年02月08日
    浏览(49)
  • JAVA面试题分享五百六十五:为啥Redis用哈希槽,不用一致性哈希?

    无论是哈希槽,还是一致性hash,都属于hash取模数据分片。 先从经典的hash取模数据分片说起 假如 Redis集群的节点数为3个,使用经典的hash取模算法进行数据分片,实际上就是一个节点一个数据分片,分为3片而已。 每次请求使用 hash(key) % 3 的方式计算对应的节点,或者进行

    2024年04月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包