2012-01-09 5 views
2

私はPythonでファイルを読み込んでおり、最後の500バイト分の識別子をファイルに作成するという問題があります。私は識別子がそのチャンク内の同じ正確なバイトを共有するすべてのファイルで同じであることを望みますが、実際のバイトは任意の順序である可能性があります。あるバイトが見つからないか追加された場合、私はその識別子を別にしたいと思います。私はスピードが重要であるため、人々が持つ可能性のある設計や実装アドバイスを探しています。Pythonでランダムな順序で同じデータに対して同じハッシュIDを作成するにはどうすればよいですか?

ありがとうございます。

答えて

5

ハッシングは私の専門分野ではありませんが、数値に基づいてバイトをソートしてからハッシュしています。 NRafのアイデア@実装

+1

私も専門家ではありませんが、多分コレクションを作ろうとしています。もちろん、1バイトが欠落していても同じバイトが追加された場合、同じハッシュが得られます。 –

+0

バイトの並べ替えは効率的で簡単な方法です。バイトをソートし、MD5/CRC-32/Adler-32 /何でも処理します。 –

4

import hashlib 

def lasthash(data): 
    m = hashlib.md5("".join(sorted(data))) 
    return m.hexdigest() 
2

は、データのヒストグラムを作成し、それは、256回の可能なバイトのそれぞれの数をカウントしています。

これはソートとハッシュのアプローチよりもはるかに高速です。

count = [0]*256 
for byte in data: 
    count[byte] += 1 
4

ファイルの最後の500バイト程度の識別子を作成する問題。 同じチャンク内の同じ バイトを共有するすべてのファイルで同じ識別子を使用したいと思いますが、実際のバイトは任意の順序で指定できます。 バイトが見つからないか追加された場合は、識別子が異なるようにしたいと思います。その後、

多重度が重要な場合(それは特定のバイトが発生した回数かどうかを問題にすることを意味する)、collections.Counterを使用し、その項目()frozensetハッシュを実行します。

>>> hash(frozenset(Counter(f.read()[-500:]).items())) 
133156838395276 

多重度が重要でない場合は、frozensetハッシュを直接使用することができます。

>>> hash(frozenset(f.read()[-500:])) 
814428559884891156 
関連する問題