Python哈希在线程之间有所不同
我在Windows上使用Python3.6,有一个可并行化的任务,包括计算字符串哈希。这基本上是我的问题的一个最小版本:Python哈希在线程之间有所不同,python,hash,concurrency,parallel-processing,Python,Hash,Concurrency,Parallel Processing,我在Windows上使用Python3.6,有一个可并行化的任务,包括计算字符串哈希。这基本上是我的问题的一个最小版本: #!/usr/bin/env python3 from joblib import Parallel, delayed def hash_some(foo): return hash(foo) def main(): hashes = Parallel(n_jobs=10)(delayed(hash_some)(s) for s in ['a', 'a
#!/usr/bin/env python3
from joblib import Parallel, delayed
def hash_some(foo):
return hash(foo)
def main():
hashes = Parallel(n_jobs=10)(delayed(hash_some)(s) for s in ['a', 'a', 'a'])
print(hashes)
if __name__ == '__main__':
main()
现在,出于某种原因,该打印文件打印出以下内容:
[3220780809080710068, -561460911962106608, -1551910331007446174]
它们显然应该是一样的
散列并不总是不同的,尤其是对于较低的n_作业
值,它们的结果通常是相同的,但这不能保证
我知道
hash()
在每个程序调用中使用随机种子,但为什么它显然在每个线程中使用不同的种子?有没有办法为我的所有线程设置一个固定(但随机)种子?(我知道PYTHONHASHSEED=0,但我更喜欢在代码中找到解决方案)正如你已经解释过的,散列的随机化可以用PYTHONHASHSEED控制,更多信息请阅读。现在,如果您希望通过代码控制行为,而不是使用python解释器选项或导出该环境。var一个可能的解决方案可以是这样的:
#!/usr/bin/env python3
import random
import os
from joblib import Parallel, delayed
os.environ['PYTHONHASHSEED'] = '0'
def hash_some(foo):
return hash(foo)
def main():
hashes = Parallel(n_jobs=10)(delayed(hash_some)(s) for s in 'a' * 10000)
print(set(hashes))
if __name__ == '__main__':
main()
如果您对
os.environ
行进行注释,您将看到最终设置的长度不再是1我现在的临时解决方法是使用显式哈希:hashlib.md5(foo.encode()).hexdigest()