2017-10-24 11 views
-1

私は、ユーザーが事前に決めた一意の識別子を取得してハッシュし、それを辞書にマッピングしてユーザーの名前に格納するプログラムを作成しました。私は後で一意の識別子を受け取り、それを再ハッシュし、ユーザーの名前を調べることができます。python hash()の衝突を扱う

私は、個人の9桁のユニークなIDハッシュ()が他の人と同じ番号になっているところで問題に遭遇しました。これは約40人のユーザーのデータを収集した後に発生しています。

これには一般的な回避策がありますか?ハッシュマップを使用するだけではなく、ハッシュされたIDのバケットを作成すると、そのバケット内の最初のアイテムかどうかをユーザーが誰に伝えることができなくなるからです。

編集:

id = raw_input() 
hashed_id = hash(id) 
if not dictionary.has_key(hashed_id): 
    name = raw_input() 
    dictionary[hashed_id] = name 
check_in_user(dictionary[hashed_id]) 
+1

これは、辞書やセットで '__hash__' **と**' __eq__'の両方を実装する必要があるため、衝突の際に二重チェックできます。 [mcve]がなければ、あなたが何かを変更する必要があるかどうかを具体的に示唆することは難しいです。 – jonrsharpe

+1

ユニークな識別子のハッシュの代わりに、ユニークな識別子を辞書のキーとして使用した場合はどうなりますか?識別子は一意であるため、衝突があってはいけません。 – Kevin

+1

あなたの幸運(または運)はおそらく神聖な割合です..しかし、他のユーザーが言ったように、あなたがしなければならないのは**入力された**ハッシュ値をチェックして**保存された**ハッシュ値**ユーザー**;すべてのユーザーではありません。 –

答えて

0

私はこのために使用hash()を見たことがありません。 hash()は、辞書の内部実装のキーなど、オブジェクト全体の略語としてデータ構造に使用する必要があります。

代わりに、ユーザーにUUID(ユニバーサルユニークID)を使用することをお勧めします。

import uuid 
uuid.uuid4() 
# UUID('d36b850c-2433-42c6-9252-6371ea3d33c2') 

あなたはのUUIDのうち、衝突を得るためにvery hard pressedでしょう。