python hash每次调用结果不同的原因


Posted in Python onNovember 21, 2019

这篇文章主要介绍了python hash每次调用结果不同的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

import time
import multiprocessing

device = ['3695a1c7-0fa6-4fa8-a563-8fd462c04af5', '0dfdd431-f9bc-4c90-b246-f2b19d20969c', '0323488d-7c9c-4244-8fc6-07266124d2f0', '689cde3c-6ca4-4ed7-b63a-e114b76650fb', 'bc4084a5-da8e-4673-a214-4b5f5de4b21d', 'b6ec0d69-af49-43d1-b77d-e72da48df2e6', 'a7fe06e8-ff26-4ebf-b526-ca7083ccb031', '7a8db973-6a7b-481b-ba80-0afb5594b6cd', '637db54f-9932-4d8e-8b87-5c92011578e9', '506b79bd-e174-4c24-8e39-9410ef7ef1f2']

def do_hash(d):
  print("%s %d %d %d" % (d, hash(d), hash(d), hash(d)%10))
  time.sleep(0.01)

res, pool = [], multiprocessing.Pool(processes=len(device))
for d in device:
  do_hash(d)
  for i in range(10):
    res.append(pool.apply_async(do_hash, args=(d,)))

while res:
  for ret in res:
    if ret.ready():
      res.remove(ret)
    time.sleep(0.01)

如上代码,用来验证hash的结果。

  • 在同一个程序运行过程中,单进程下,hash同一个字符串,结果是否一致。 答案:一致
  • 在同一个程序运行过程中,多进程中,不同子进程hash同一个字符串,结果是否一致。答案:一致
  • 同样的代码,多次运行同一个程序,每次运行程序时,hash同一个字符串,产生的结果和其他运行过程产生的结果是否一致。答案:不一致

如下是运行测试。

运行一次

$python3 ~/t.py |sort |uniq -c
 11 0323488d-7c9c-4244-8fc6-07266124d2f0 -6009992680465351322 -6009992680465351322 8
 11 0dfdd431-f9bc-4c90-b246-f2b19d20969c -5508606457111079556 -5508606457111079556 4
 11 3695a1c7-0fa6-4fa8-a563-8fd462c04af5 4707712037038632691 4707712037038632691 1
 11 506b79bd-e174-4c24-8e39-9410ef7ef1f2 857824721138771069 857824721138771069 9
 11 637db54f-9932-4d8e-8b87-5c92011578e9 5754536697633125890 5754536697633125890 0
 11 689cde3c-6ca4-4ed7-b63a-e114b76650fb 5254068311346342848 5254068311346342848 8
 11 7a8db973-6a7b-481b-ba80-0afb5594b6cd 6569556914358930293 6569556914358930293 3
 11 a7fe06e8-ff26-4ebf-b526-ca7083ccb031 -7752949605389894777 -7752949605389894777 3
 11 b6ec0d69-af49-43d1-b77d-e72da48df2e6 5391450356066231067 5391450356066231067 7
 11 bc4084a5-da8e-4673-a214-4b5f5de4b21d 8663379699579545061 8663379699579545061 1

再运行一次:

$ python3 ~/t.py |sort |uniq -c
 11 0323488d-7c9c-4244-8fc6-07266124d2f0 6637200495818958087 6637200495818958087 7
 11 0dfdd431-f9bc-4c90-b246-f2b19d20969c 2550085777036819750 2550085777036819750 0
 11 3695a1c7-0fa6-4fa8-a563-8fd462c04af5 3291757742095134676 3291757742095134676 6
 11 506b79bd-e174-4c24-8e39-9410ef7ef1f2 -1500680899775158570 -1500680899775158570 0
 11 637db54f-9932-4d8e-8b87-5c92011578e9 -1846084821474967397 -1846084821474967397 3
 11 689cde3c-6ca4-4ed7-b63a-e114b76650fb -8218022715868473813 -8218022715868473813 7
 11 7a8db973-6a7b-481b-ba80-0afb5594b6cd -783003051379698560 -783003051379698560 0
 11 a7fe06e8-ff26-4ebf-b526-ca7083ccb031 -4314803525216302877 -4314803525216302877 3
 11 b6ec0d69-af49-43d1-b77d-e72da48df2e6 1699421278255228297 1699421278255228297 7
 11 bc4084a5-da8e-4673-a214-4b5f5de4b21d 6135446317717420100 6135446317717420100 0

原因是:

python的字符串hash算法并不是直接遍历字符串每个字符去计算hash,而是会有一个secret prefix和一个secret suffix,可以认为相当于是给字符串加盐后做hash,可以规避一些规律输入的情况显然这个secret前后缀的值会直接影响计算结果,而且它有一个启动时随机生成的机制,只不过,在2.x版本中,这个机制默认是关闭的,前后缀每次启动都设置为0,除非你改了相关环境变量来要求随机,而在3.x中修改了默认行为,如果你不配置环境变量,则默认是随机一个前后缀值,这样每次启动都会不同这个环境变量是PYTHONHASHSEED,无论在2.x还是3.x中,配置为一个正整数,将作为随机种子;配置为0,则secret前后缀默认清零(和2.x默认行为就一样了),配置为空串或“random”,则表示让进程随机生成(和3.x默认行为一样)具体为啥要这么做,猜测一个是为了安全性(防字符串hash表的攻击,比如php曾经碰到的攻击),另一个可能也是强调不要依赖一些内建结果,因为这种算法可能随着版本而更新,避免有些用户不看文档,误以为是永远不变的

设置固定的PYTHONHASHSEED后结果一致:

yzc:~ youzhengchuan$ PYTHONHASHSEED=10 python3 ~/t.py |sort |uniq -c
 11 0323488d-7c9c-4244-8fc6-07266124d2f0 2141519202912666524 2141519202912666524 4
 11 0dfdd431-f9bc-4c90-b246-f2b19d20969c -843959203188636526 -843959203188636526 4
 11 3695a1c7-0fa6-4fa8-a563-8fd462c04af5 5124534335560792207 5124534335560792207 7
 11 506b79bd-e174-4c24-8e39-9410ef7ef1f2 -8435934314154906615 -8435934314154906615 5
 11 637db54f-9932-4d8e-8b87-5c92011578e9 -8619377286856168125 -8619377286856168125 5
 11 689cde3c-6ca4-4ed7-b63a-e114b76650fb 9094422155202130727 9094422155202130727 7
 11 7a8db973-6a7b-481b-ba80-0afb5594b6cd 1077850608746704706 1077850608746704706 6
 11 a7fe06e8-ff26-4ebf-b526-ca7083ccb031 -4716484918100210177 -4716484918100210177 3
 11 b6ec0d69-af49-43d1-b77d-e72da48df2e6 -5676381002318020516 -5676381002318020516 4
 11 bc4084a5-da8e-4673-a214-4b5f5de4b21d 4107242733003648281 4107242733003648281 1
yzc:~ youzhengchuan$ PYTHONHASHSEED=10 python3 ~/t.py |sort |uniq -c
 11 0323488d-7c9c-4244-8fc6-07266124d2f0 2141519202912666524 2141519202912666524 4
 11 0dfdd431-f9bc-4c90-b246-f2b19d20969c -843959203188636526 -843959203188636526 4
 11 3695a1c7-0fa6-4fa8-a563-8fd462c04af5 5124534335560792207 5124534335560792207 7
 11 506b79bd-e174-4c24-8e39-9410ef7ef1f2 -8435934314154906615 -8435934314154906615 5
 11 637db54f-9932-4d8e-8b87-5c92011578e9 -8619377286856168125 -8619377286856168125 5
 11 689cde3c-6ca4-4ed7-b63a-e114b76650fb 9094422155202130727 9094422155202130727 7
 11 7a8db973-6a7b-481b-ba80-0afb5594b6cd 1077850608746704706 1077850608746704706 6
 11 a7fe06e8-ff26-4ebf-b526-ca7083ccb031 -4716484918100210177 -4716484918100210177 3
 11 b6ec0d69-af49-43d1-b77d-e72da48df2e6 -5676381002318020516 -5676381002318020516 4
 11 bc4084a5-da8e-4673-a214-4b5f5de4b21d 4107242733003648281 4107242733003648281 1
yzc:~ youzhengchuan$ PYTHONHASHSEED=10 python3 ~/t.py |sort |uniq -c
 11 0323488d-7c9c-4244-8fc6-07266124d2f0 2141519202912666524 2141519202912666524 4
 11 0dfdd431-f9bc-4c90-b246-f2b19d20969c -843959203188636526 -843959203188636526 4
 11 3695a1c7-0fa6-4fa8-a563-8fd462c04af5 5124534335560792207 5124534335560792207 7
 11 506b79bd-e174-4c24-8e39-9410ef7ef1f2 -8435934314154906615 -8435934314154906615 5
 11 637db54f-9932-4d8e-8b87-5c92011578e9 -8619377286856168125 -8619377286856168125 5
 11 689cde3c-6ca4-4ed7-b63a-e114b76650fb 9094422155202130727 9094422155202130727 7
 11 7a8db973-6a7b-481b-ba80-0afb5594b6cd 1077850608746704706 1077850608746704706 6
 11 a7fe06e8-ff26-4ebf-b526-ca7083ccb031 -4716484918100210177 -4716484918100210177 3
 11 b6ec0d69-af49-43d1-b77d-e72da48df2e6 -5676381002318020516 -5676381002318020516 4
 11 bc4084a5-da8e-4673-a214-4b5f5de4b21d 4107242733003648281 4107242733003648281 1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的descriptor描述器简明使用指南
Jun 02 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
Python将多个list合并为1个list的方法
Jun 27 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
python的常用模块之collections模块详解
Dec 06 Python
python读取指定字节长度的文本方法
Aug 27 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
pygame实现非图片按钮效果
Oct 29 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
Python接口测试环境搭建过程详解
Jun 29 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 Python
如何用Python徒手写线性回归
Jan 25 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 #Python
Python 复平面绘图实例
Nov 21 #Python
Python3并发写文件与Python对比
Nov 20 #Python
python实现高斯(Gauss)迭代法的例子
Nov 20 #Python
python、Matlab求定积分的实现
Nov 20 #Python
python 求定积分和不定积分示例
Nov 20 #Python
python 计算积分图和haar特征的实例代码
Nov 20 #Python
You might like
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
激活 ActiveX 控件
2006/10/09 Javascript
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
python 怎样进行内存管理
2020/11/10 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
Overload和Override的区别
2012/09/02 面试题
医学护理毕业生自荐信
2013/11/07 职场文书
大专毕业生自我鉴定
2013/11/21 职场文书
晨会主持词
2014/03/17 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
法人代表资格证明书
2015/06/18 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书