2017-04-22 17 views
1

나는 다음과 같은 기능을 사용하여 고유 레코드 ID를 만들려고 오전 : hashlib.sha256을 사용하여 고유 ID 생성; 독특한 것임이 보장 되나요?

import hashlib 
from base64 import b64encode 

def make_uid(salt, pepper, key): 
    s = b64encode(salt) 
    p = b64encode(pepper) 
    k = b64encode(key) 
    return hashlib.sha256(s + p + k).hexdigest() 

pepper는 다음과 같이 설정되는 경우 :

uuid_pepper = uuid.uuid4() 
pepper = str(uuid_pepper).encode('ascii') 

그리고 saltkey 모든 요청에 ​​대해 동일한 값입니다.

내 질문에, 고추의 독특한 성격 때문에,이 intance에 make_uid 항상 고유 값을 반환하거나, 그것은 중복을 만들 수있는 기회가 무엇입니까?

suggested answer은 다양한 uuid 유형의 고유성에 대해 묻지 않기 때문에 다릅니다. sha256 해시가 두 개의 다른 입력 사이에 충돌을 일으킬 수 있는지 궁금합니다.

+0

[언제 파이썬에서 uuid.uuid1()과 uuid.uuid4()를 사용해야합니까?] (http://stackoverflow.com/questions/1785503/when-should-i-use-uuid- – m0nhawk

+0

@ m0nhawk- 내가 uuid1 또는 uuid4를 사용해야하는지 묻지 않고 있는데,이 경우 hexdigest가 항상 고유한지 물어 본다. – mwkrimson

+0

링크를 클릭하여 읽으면 해당 질문에 대답 ** ** 답변도 표시됩니다. – m0nhawk

답변

2

SHA256이 고유 해시 결과를 생성하도록 보장되는지 여부를 알고 싶습니다. 대답은 '예'입니다. 내 연구 결과가 100 % 정확하지는 않지만 가까운 결과를 얻었습니다.

이론 상으로는 SHA256이 충돌합니다. 그것에는 2^256 결과가 있습니다. 따라서 우리가 2^256 + 1 시간을 해쉬한다면, 충돌이 있어야합니다. 더 나쁜 통계에 따르면, 충돌의 가능성은 해싱의 내입니다 99%.

하지만 평생 동안 하나를 생성하지 않을 것입니다. 초당 10,000 개의 해시를 계산할 수있는 컴퓨터가 있다고 가정합니다. 이 컴퓨터 4 * 10^27 년은 2^130 해시를 끝내야합니다. 이 숫자가 얼마나 큰지 전혀 알지 못할 수도 있습니다. 해싱을하는 년수는 지구상에 인간이 존재하는 해의 수의 2 * 10^22입니다. 즉, 우리가 지금까지 지구상에 있었던 첫날부터 해싱을 시작 했더라도 충돌 가능성은 여전히 ​​매우 미미합니다.

귀하의 질문에 대한 답변입니다.

+0

예, 이것은 제가 찾고있는 대답입니다. 이론적으로는 다른 입력과의 충돌이있을 수 있습니다. 말도 안되지만 여전히 가능할 것 같습니다. 감사! – mwkrimson