2017-02-02 12 views
1

私はWindows上でPython 3.6を使用しており、コンピューティングストリングハッシュを含む並列化可能なタスクを持っています。これは、基本的には私の問題の最小バージョンです:スレッド間でPythonのハッシュが異なる

#!/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について知っていますが、コード内の解決策を見つけることを好むでしょう)

+0

一時的な回避策はありませんがわかりますos.environ行が使用することです明示的なハッシュ: 'hashlib.md5(foo.encode())。hexdigest()' – Opossum

答えて

1

すでに説明したように、ハッシュのランダム化はPYTHONHASHSEEDで制御できます。詳細はthisを読んでください。今、あなたがPythonインタプリタのオプションではなくコードで振る舞いを制御したい場合や、envをエクスポートする場合。 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() 

あなたは最終セットの長さは今私のためにもう1

関連する問題