惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
H
Hacker News: Front Page
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
Lohrmann on Cybersecurity
Cisco Talos Blog
Cisco Talos Blog
O
OpenAI News
S
Securelist
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
H
Heimdal Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
Latest news
Latest news
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic
D
Docker
D
DataBreaches.Net
A
About on SuperTechFans
T
Tor Project blog
V
V2EX
G
Google Developers Blog
博客园 - Franky
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
I
InfoQ
H
Help Net Security
V2EX - 技术
V2EX - 技术
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Security Affairs
SecWiki News
SecWiki News
The Register - Security
The Register - Security
人人都是产品经理
人人都是产品经理
NISL@THU
NISL@THU
小众软件
小众软件
B
Blog
T
Threatpost
P
Palo Alto Networks Blog
博客园 - 【当耐特】
L
LangChain Blog
AWS News Blog
AWS News Blog
月光博客
月光博客
宝玉的分享
宝玉的分享

博客园 - 川川籽

GO面试题:new 和 map 的区别 minikube dashboard ImagePullBackOff 失败问题的解决方法 hashicorp/raft模块实现的raft集群存在节点跨集群身份冲突问题 macos 13安装openvpn - 川川籽 [转发] Go pprof内存指标含义备忘录 自己搭建一个https的dns,让不同的浏览器使用不同的DNS,使用相同的域名访问到不同的主机上 记一次docker buildx build 推送到本地私有仓库出现 connection refused 的问题 Linux C 获取本机IPV4和IPV6地址列表 Mac M1 安装python3.6.x golang map 和 interface 的一些记录 MacOS M1 安装python3.5 使用php的openssl_encrypt和python的pycrypt进行跨语言的对称加密和解密问题 golang random string 【转载】coroutine 与 goroutine 区别 python简单的time ticker 'invalid flag in #cgo LDFLAGS: -w' 问题解决 记录一次python的mysqlclient依赖库报错问题 airflow当触发具有多层subDAG的任务的时候,出现[Duplicate entry ‘xxxx’ for key dag_id]的错误的问题处理 Python3并发写文件
python hash 每次调用结果不一样
川川籽 · 2019-11-14 · via 博客园 - 川川籽
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曾经碰到的攻击),另一个可能也是强调不要依赖一些内建结果,因为这种算法可能随着版本而更新,避免有些用户不看文档,误以为是永远不变的

作者:冒泡
链接:https://www.zhihu.com/question/57526436/answer/153241020
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

设置固定的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