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 相关文章推荐
400多行Python代码实现了一个FTP服务器
May 10 Python
Python线程中对join方法的运用的教程
Apr 09 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
Python实现的随机森林算法与简单总结
Jan 30 Python
TensorFlow如何实现反向传播
Feb 06 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
Python闭包和装饰器用法实例详解
May 22 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
简单了解python数组的基本操作
Nov 26 Python
python 实现快速生成连续、随机字母列表
Nov 28 Python
python实现同一局域网下传输图片
Mar 20 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
php中require和require_once的区别说明
2014/02/27 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
详解Python中time()方法的使用的教程
2015/05/22 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
python调用win32接口进行截图的示例
2020/11/11 Python
Python实现京东抢秒杀功能
2021/01/25 Python
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
好的自荐信的要求
2013/10/30 职场文书
暑期培训随笔感言
2014/03/10 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP