2017-10-24 26 views
-1

나는 사용자가 미리 결정한 고유 식별자를 가져 와서 해시하고이를 사용자 이름에 사전 매핑으로 저장하는 프로그램을 만들었습니다. 나는 나중에 고유 한 식별자를 받고, 다시 해쉬하고, 사용자의 이름을 조회 할 수 있습니다.파이썬 해시() 충돌 처리

개인의 9 자리 고유 ID hash()가 다른 사람과 동일한 숫자로 문제가 발생했습니다. 이는 약 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 (Universally Unique Identifier)를 사용하는 것이 좋습니다.

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

UUID에서 충돌을 얻으려면 very hard pressed이됩니다.