我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于Python实现Hash算法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于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)对象
  • 通过取余数的方式 公式:哈希地址,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

3.3 总结

  • 应用广泛,很好的解决了服务器宕机,节点删除等问题
  • IP地址指向不同的服务器访问地址,为不同的服务器上的数据库存取提供了便利

到此这篇关于基于Python实现Hash算法的文章就介绍到这了,更多相关Python实现Hash算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于Python实现Hash算法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于Python如何实现Hash算法

本篇内容主要讲解“基于Python如何实现Hash算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现Hash算法”吧!1 前言Simhash的算法简单的来说就是,从海量文
2023-06-29

基于python快速实现排列组合算法

1.python语言简单、方便,其内部可以快速实现排列组合算法,下面做简单介绍、2.一个列表数据任意组合2.1主要是利用自带的库#_*_ coding:utf-8 _*_#__author__='dragon'import itertool
2023-01-31

ava实现一致性Hash算法

本文主要详细介绍了Java如何实现一致性Hash算法,其实现原理将key映射到 2^32 - 1 的空间中,将这个数字的首尾相连,形成一个环。想了解更多的同学,可以参考本文
2023-03-24

如何用Python实现基于蒙特卡洛算法小实验

今天就跟大家聊聊有关如何用Python实现基于蒙特卡洛算法小实验,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。用Python实现基于蒙特卡洛算法小实验蒙特卡洛算法思想蒙特卡洛(Mon
2023-06-02

ava如何实现一致性Hash算法

这篇文章主要介绍了ava如何实现一致性Hash算法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ava如何实现一致性Hash算法文章都会有所收获,下面我们一起来看看吧。1. 实现原理将key映射到 2^32 -
2023-07-05

Python基于均值漂移算法和分水岭算法实现图像分割

图像分割是将图像分成若干具有独特性质的区域并提取感兴趣目标的技术和过程。这篇文章将详细讲解基于均值漂移算法和分水岭算法的图像分割,需要的可以参考一下
2023-01-11

Python基于DFA算法怎么实现内容敏感词过滤

这篇文章主要讲解了“Python基于DFA算法怎么实现内容敏感词过滤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于DFA算法怎么实现内容敏感词过滤”吧!DFA 算法是通过提前
2023-06-30

Python基于决策树算法的分类预测怎么实现

今天小编给大家分享一下Python基于决策树算法的分类预测怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、决策树的
2023-06-26

Python实现的人工神经网络算法示例【基于反向传播算法】

本文实例讲述了Python实现的人工神经网络算法。分享给大家供大家参考,具体如下: 注意:本程序使用Python3编写,额外需要安装numpy工具包用于矩阵运算,未测试python2是否可以运行。 本程序实现了《机器学习》书中所述的反向传播
2022-06-04

基于Matlab怎么实现鲸鱼优化算法

这篇文章主要介绍“基于Matlab怎么实现鲸鱼优化算法”,在日常操作中,相信很多人在基于Matlab怎么实现鲸鱼优化算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Matlab怎么实现鲸鱼优化算法”的疑
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录