Python哈希在线程之间有所不同

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

我在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', '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()