线程之间的Python哈希值不同

时间:2017-02-02 10:35:10

标签: python hash concurrency parallel-processing

我在Windows上使用Python 3.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_job值,它们通常会变得相同,但这不能保证。

我知道hash()每个程序调用使用一个随机种子但为什么它显然每个线程使用不同的种子?有什么方法可以为我的所有线程设置固定(但随机)的种子吗? (我知道PYTHONHASHSEED=0,但我更愿意找到代码内解决方案)

1 个答案:

答案 0 :(得分:2)

正如您已经解释过的,可以使用PYTHONHASHSEED控制散列的随机化,有关更多信息,请阅读this。现在,如果您想通过代码控制行为而不是使用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