2016-06-23 5 views
0

私はPythonのhash()ソルトを個々の関数呼び出しに設定する方法を探しています。ドキュメントでは、のすべての塩を設定するPYTHONHASHSEEDしか見つかりませんでした。hash()に呼び出します。 しかし、特定のオブジェクトによって呼び出されたときに常に同じ結果を得るにはhashが必要ですが、アプリケーション全体に同じ(予測可能な)塩を使用させたくありません。個々の呼び出しのハッシュソルトを設定する


コンテキスト:python2では、私は、インデックス付きのバケットにキーと値のオブジェクトのペアをソートするhashを使用しています。バケットは永続的に格納されます。これを逆にして値を取得します。基本的に、すべてのペアのために、私は、これは常にインタプリタの呼び出しを越え、インスタンスごとに私に同じ結果を得るためにhashを必要

class PDict(object): 
    def __init__(self, bucket_count, bucket_store_path): 
    self._path, self.bucket_count = \ 
     self._fetch_or_store_metadata(bucket_store_path, bucket_count) 

    def __setitem__(self, key, value): 
    bucket_index = (hash(key)&0xffffffff) % self.bucket_count 
    self.buckets[bucket_index][key] = value 
    self._store_bucket(bucket_index) 

    def __getitem__(self, key): 
    bucket_index = (hash(key)&0xffffffff) % self.bucket_count 
    return self._fetch_bucket(bucket_index)[key] 

ください。

+0

なぜそうしたいのですか? – jonrsharpe

+0

バケットは永続的に格納されるので、私はバケットセットごとに同じ 'ハッシュ'ソルトが必要です。最初の問題:固定塩を使用すること**とは、データ構造を使用するすべての**アプリケーションは同じ塩を使用する必要があることを意味します。これは塩の点を打ち負かします。 2番目の問題:動的な塩を使用すると、アプリケーションが**異なる塩を必要とする2つのバケットセットを使用して終了する可能性があることを意味します。これは単なるPYTHONHASHSEEDでは不可能です。 – MisterMiyagi

+0

@jonrsharpe関連の質問に感謝し、それは "不可能"と答えていると推測します。しかたがない。 – MisterMiyagi

答えて

1
import hashlib 
def getHash(name): 
    m = hashlib.md5() 
    m.update(name) 
    return m.hexdigest() 
+0

これはバイトオブジェクトの場合にのみ有効です。一番上に、それはx10の速度が遅いです(ただし、usecスケールではまだです)。 – MisterMiyagi

+0

@MisterMiyagiは関数に渡すよりobjを処理できますか? idや他のメソッドを使う – galaxyan

+0

原則として、はい、しかし私は安定した変換を知らない。だから私は最初に 'ハッシュ'を使ってきたのです。 'id'はメモリ位置だけを取得するので、インタプリタ呼び出しの間には予測できません。 'str'と' repr'の両方が広範な文字列(悪い)を生成し、 'id'(悪い)に落ちます。 – MisterMiyagi

関連する問題