基于Python实现的Hash算法

news/2024/12/29 15:38:36/

1 前言

2 一般hash算法

最简单的hash算法是用取余的方式,根据hash地址存放数据,这需要提供键值对(Key-value)Key是地址,value是存放的数据

2.1 算法逻辑

  • 输入存放数据,并建立(Key-value)对象
  • 通过取余数的方式 公式 H = d H=d%n H=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一个节点对应,# 默认节点是为2self._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+iprint('虚拟节点字符串',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] # 返回当前虚拟节点哈希地址对应节点IPreturn 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.4192.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地址指向不同的服务器访问地址,为不同的服务器上的数据库存取提供了便利

http://www.ppmy.cn/news/756037.html

相关文章

php计算hash_php实现hash值计算(浅谈php的高精度计算)

最近使用php实现一个hash算法&#xff0c;问题和解决方法如下&#xff1a; 1、php只支持有符号整数&#xff0c;需要自己进行有符号数与无符号数的转换。 正整数(64位)存储的是对应数值&#xff0c;负数存储为对应数值补码。 function StrToInt($str) { if (bccomp($str, 92233…

Hadoop HA 配置文件以及自动化Shell脚本开关HA集群

目录 配置文件 workers core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml 自动化Shell脚本 format-ha hadoop-ha jpsall xcall xsync zk 测试自动化脚本 HA集群初始化 启动HA集群 关闭HA集群 配置文件 workers hadoop102 hadoop103 hadoop104 co…

HashMap的工作原理(一):Hash算法

1、什么是Hash Hash也被称为散列、哈希&#xff0c;对应的英文都是Hash.他们的基本原理都是把任意长度的输入&#xff0c;通过Hash算法变成固定长度的输出.这个映射的规则就是对应的Hash算法&#xff0c;而原始数据映射之后的二进制串就是哈希值. 经常使用的Hash算法有MD5和SHA…

Dhrystone基准测试程序在Google Pixel4上运行跑分教程

记录一下实验过程&#xff0c;方便后续回顾 一、Dhrystone简介 Dhrystone是测量处理器运算能力的最常见基准程序之一&#xff0c;常用于处理器的整型运算性能的测量。程序是用C语言编写的&#xff0c;因此C编译器的编译效率对测试结果也有很大影响。 但其也有许多不足&#x…

【C++学习笔记】RAII思想——智能指针

智能指针 1 内存泄漏问题2 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;2.1 使用RAII思想设计的SmartPtr类2.2 智能指针的原理2.3 小总结智能指针原理 3 智能指针的拷贝问题3.1 std::auto_ptr3.2 std::unique_ptr3.3 std::shared_ptr3.3.1 拷贝构造函数…

0501逻辑存储结构和架构-InnoDB引擎-MySQL-数据库

文章目录 1 逻辑结构1.1 表空间1.2 段1.3 区1.4 页1.5 行 2 架构2.1 内存架构2.1.1 Buffer Pool2.1.2 change bufer2.1.3 自适应哈希2.1.4 log buffer 2.2 磁盘架构2.2.1 System Tablespace2.2.2 File-Per-Table Tablespace2.2.3 General Tablespaces2.2.4 Undo Tablespaces2.2…

k3s单机环境搭建(飞腾+麒麟)

k3s单机环境搭建&#xff08;飞腾麒麟&#xff09; k3s介绍环境信息k3s部署运行k3s安装脚本配置镜像加速 安装kubernetes-dashboard部署kubernetes-dashboard配置RBAC访问kubernetes-dashboard 安装监控组件安装kube-prometheus配置数据持久化访问grafana k3s介绍 k3s是ranche…

斐讯K3c基于frp内网穿透

斐讯K3c基于frp内网穿透 前面的版本升级就是为了后面内网穿透更好进行内网穿透 内网穿透的前提需要&#xff1a;一个拥有固定的ip地址的主机&#xff1b; 常规家用网络运营商都采用的是动态ip&#xff0c;ip随时在变化 我这里用到的是 腾讯云:大家有需要也可以购买。 新用户…