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

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

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 hashlibmessage='今天是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 hashlibclass 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] = nodeself.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 Nonehashed_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}")#这里使用的哈希函数为SHA1def 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’

参考资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯上岸每日N题 第一期(一)!!!

大家好 我是寸铁&#x1f4aa; 考前需要刷大量真题,大家一起相互监督&#xff0c;每日做N题&#xff0c;一起上岸吧✌️ ~ 第一期(一) 题目&#xff1a;回文日期 ✨ 考点&#xff1a;枚举模拟 &#x1f4aa; 该题目类型会同时收录在相关复习专题&#xff0c;供大家学习 收…

计算机网络基础-OSI七层模型 和 TCP/IP四层模型的对比

OSI七层模型 和 TCP/IP四层模型的对比 OSI七层模型&#xff1a; 理论上的网络通信模型 记忆&#xff1a; (物、链、网、输、会、示、用) TCP/IP四层模型&#xff1a; 实际上的网络通信标准 (1) 七层网络体系结构各层的主要功能&#xff1a; 应用层&#xff1a; 最上层的&am…

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

一、基本概念 1.什么是Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强&#xff0c;其并发能力确实在同类型的网页server中表现较好。 http服务器 Web服务器是指驻留于因特网上某种类型计算机的程…

请问支付功能如何测试

目录 01测试思维 02支付功能的测试点 一&#xff1a;支付的分类&#xff1a; 二&#xff1a;功能测试 三&#xff1a;接口测试 四&#xff1a;安全测试 五&#xff1a;测试点 01测试思维 要分析测试点之前&#xff0c;我们先来梳理一下测试思维。总结来说&#xff0c;任…

IP首部报文字段

一、IP首部报文字段 字段如下图所示 二、每个字段的含义 版本 表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4&#xff0c;即 IPv4 首部长度 这个字段所表示数的单位是 32 位字长&#xff08;1 个 32 位字长是 4 字节&#xff0…

分布式事务 Seata

分布式事务 Seata 事务介绍分布式理论Seata 介绍Seata 部署与集成Seata TC Server 部署微服务集成 Seata XA 模式AT 模式AT 模式执行过程读写隔离写隔离读隔离 实现 AT 模式 TCC 模式TCC 模式介绍实现 TCC 模式 Saga 模式Seata 四种模式对比 事务介绍 事务&#xff08;Transac…

uniapp引入echarts

作为前端在开发需求的时候经常会遇到将数据展示为图表的需求&#xff0c;之前一直用的HBuilder的图表插件uCharts&#xff0c;使用方法可以参考我的另一篇博客&#xff1a;uniapp 中使用图表&#xff08;秋云uCharts图表组件&#xff09; 但是最近发现uCharts很多功能都需要付…

Bard:一个可以描述图像的人工智能

Bard 是一个大型语言模型&#xff0c;可以对各种提示和问题进行交流和生成类似人类的文本。它接受了大量的文字和代码训练&#xff0c;可以生成文本、翻译语言、编写不同类型的创意内容&#xff0c;并以信息丰富的方式回答你的问题。 Bard 还可以识别图像。它可以识别图像中的…

代理IP、Socks5代理、SK5代理与网络安全:保护隐私与防御威胁的技术探索

随着数字化时代的到来&#xff0c;网络安全和个人隐私保护日益成为重要议题。代理IP、Socks5代理和SK5代理作为关键技术手段&#xff0c;为用户提供了保护隐私、提高网络安全性和防御网络威胁的解决方案。本文将深入探讨这些代理技术的原理、特点以及它们与网络安全的紧密联系。…

数组的递归筛选

数组递归筛选 根据一个值筛选出来通过 includes 递归 const options [{name: "ikun",options: [{name: "YAY11",},],},{name: "YAY",}, ];function findValue(orgOptions,val) {let newArr1 []orgOptions.forEach(item>{if(item.options…

ASUS华硕无双15_K3502ZA工厂模式原装Win11恢复原厂OEM预装系统 带ASUS Recovey恢复功能

ASUS华硕无双15笔记本电脑12代Vivobook_ASUSLaptop K3502ZA出厂Windows11系统工厂包 自带恢复功能、所有驱动、出厂主题壁纸LOGO、Office办公软件、MyASUS等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小&…

leetcode 40. 组合总和 II

2023.7.19 此题为 组合总和 的升级版。本题的特殊之处在于 给定的candidates数组只一个无序且包含重复元素的数组&#xff0c;并且最终的解集不能包含重复的组合。 所以本题的关键在于去重。那么&#xff0c;此类题的去重分为两种&#xff0c;一种是解集内部去重&#xff0c;灵…

Spring Boot学习

Spring Boot 配置 同一目录下配置文件优先级&#xff1a;.properties > .yml > .yaml 错误&#xff1a;org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1 Caused by: java.nio.charset.MalformedInputException: Inp…

VUE- 选取本地图片,自定义裁切图片比例 vue-cropper

裁切图片&#xff0c;按照比例裁切&#xff0c;分步骤 1&#xff1a;el-upload选择本地图片&#xff08;分选择本地和上传两步骤&#xff09; 2&#xff1a;在on-change回调方法中拿到el-upload选中的图片&#xff0c;显示在vueCropper上&#xff08;&#xff09;。 2.1&…

查看IP地址方法(电脑IP地址方法)

查看IP地址方法 如何识别win7还是win10系统&#xff1f; &#xff08;一&#xff09;Win7系统电脑导航栏如下&#xff1a; &#xff08;二&#xff09;Win10系统电脑导航栏如下&#xff1a; 一、win7系统查看IP地址 方法一&#xff1a;查看网络设置 点击电脑导航栏最右下…

react和vue2/3父子组件的双向绑定(sync、emit、v-model)

目录 Vue .sync&#xff08;2.3.0&#xff09; $emit &#xff08;2.3后&#xff09; 自定义组件的 v-model 2.2.0 v-modelemits(3.0取消了.sync) React 父组件回调函数 相关基础 框架 MVC &#xff08;Model View Controller&#xff09;/MVP&#xff08;Model View…

STM32 Proteus仿真可设置时间红绿灯-0075

STM32 Proteus仿真可设置时间红绿灯-0075 Proteus仿真小实验&#xff1a; STM32 Proteus仿真可设置时间红绿灯-0075 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 74HC595串入并出芯片4个2位数码管显示十字路口红绿灯时间多个按键 1.包含机动车指示灯(红、黄、…

windows安装mysql8.0.23版本成功示例-免安装

windows安装mysql8.0.23版本成功示例 一.通过mysql-installer-*.msi安装包的方式1.安装准备1.1 官网下载地址1.2 选择合适的版本点击下载 2.安装mysql 二.通过mysql-8.0.23-winx64.zip免安装方式-推荐1.安装准备1.1 下载官网压缩包1.2 解压后配置文件my.ini信息1.3 配置my.ini …

STM32MP157驱动开发——按键驱动(查询方式)

文章目录 概述APP 读取按键的 4 种方法查询方式休眠-唤醒方式poll 方式异步通知方式 查询方式的按键驱动程序&#xff08;框架&#xff09;按键驱动编写思路board_xxx.cbutton_drv.cbutton_drv.hbutton_test.cMakefile编译测试 查询方式的按键驱动程序(stm32mp157)board_stm32m…

浅谈测试工程化 - 以并发自动化框架为例

目录 前言 测试工程化 一、测试需求分析 二、测试设计 三、测试实现和落地 四、测试维护 扩展 前言 测试工程化是指将软件测试过程中的各个环节进行自动化和标准化&#xff0c;以提高测试效率、质量和可持续性。在测试工程化中&#xff0c;使用并发自动化框架是一个重要…