2010-03-12 2 views
26

업로드 된 이미지 이름, 세션 ID 등을 위해 고유 한 문자열 생성을 구현 한 몇 가지 방법을 살펴 보았으며 많은 경우 SHA1 등의 해시 사용법을 사용합니다.Python - 고유 문자열에 uuid4() 이외의 다른 용도를 사용하는 이유는 무엇입니까?

나는 이와 같은 사용자 지정 방법을 사용하는 정당성에 의문을 제기하는 것이 아니라 오히려 이유를 묻습니다. 고유 한 문자열을 원한다면 다음과 같이 말하면됩니다.

>>> import uuid 
>>> uuid.uuid4() 
UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d') 

그리고 끝났습니다. 내가 UUID에 읽어 전에 나는 매우 신뢰하지 않았다, 그래서 나는이 한 (내가 하나가 지금은 가능성이 1.108e + 50처럼 생각 기대하지 않을 것이다

>>> import uuid 
>>> s = set() 
>>> for i in range(5000000): # That's 5 million! 
>>>  s.add(str(uuid.uuid4())) 
... 
... 
>>> len(s) 
5000000 

단 한 중계기를하지만에 위안이다 행동에서 그것을 참조하십시오). 2 uuid4()을 조합하여 문자열을 만드는 것만으로도 확률을 반으로 줄일 수 있습니다.

그렇다면 사람들은 왜 고유 한 문자열 등을 위해 random() 및 기타 항목에 시간을 소비합니까? uuid와 관련하여 중요한 보안 문제가 있습니까?

+11

현재, uuid의 길이를 두 배로 늘리면 두 배가 아닌 가능한 값의 수를 제곱합니다. –

답변

19

리소스를 고유하게 식별하기 위해 해시를 사용하면 개체에서 '고유 한'참조를 생성 할 수 있습니다. 예를 들어, Git은 SHA 해시를 사용하여 단일 커밋의 정확한 변경 집합을 나타내는 고유 한 해시를 만듭니다. 해시는 결정적이므로 매번 같은 파일에 대해 동일한 해시를 얻습니다.

전 세계의 두 사람이 동일한 레포를 동일하게 변경할 수 있으며, 힘내 기자는 동일한 변경을 한 것으로 알고 있습니다. UUID v1, v2 및 v4는 파일 또는 파일의 내용과 관련이 없기 때문에이를 지원할 수 없습니다.

+1

이의 제기! 실제로 UUID는 결정적 일 수 있습니다! UUIDv3은 MD5 해시를 기반으로하며 UUIDv5는 SHA-1 해시를 기반으로합니다. – starlocke

+13

결정적인 사항 (업로드 된 파일, 자식 변경 집합 등)에 대해서는 UUIDv3 또는 UUIDv5를 선택해야하며 일시적이며 비 결정적 인 (세션, 임시 파일 등)에 대해서는 UUIDv1, UUIDv2 또는 UUIDv4를 선택해야합니다. – starlocke

+0

BTW git에는 작성자 정보와 변경 세트의 커밋 날짜가 포함되어 있으므로 다른 사용자가 동일한 변경을해도 동일한 해시가 생성되지 않습니다. '.git' 폴더에 저장된 오브젝트 파일은 유효한 유스 케이스입니다. –

5

한 가지 가능한 이유는 고유 한 문자열을 사람이 읽을 수 있도록하려는 것입니다. UUID는 읽기 쉽지 않습니다.

11

글쎄, 때로는 충돌을 원합니다. 다른 사람이 똑같은 이미지를 두 번 올린다면 새 이름으로 다른 사본을 만드는 것보다는 복제물이라고 말하고 싶을 것입니다.

+0

@Ben, 행의 다른 필드로 이미지 이름을 저장하지 않고 프로그래밍 논리를 사용하여 기존 이미지를 덮어 쓰거나 같은 이미지를 다시 업로드 할 때 "oops"라고 말하지 않을까요? – orokusaki

+0

그의 요점은 여전히 ​​유효합니다. 때때로 충돌을 원하며 GUID가 충돌을 원할 때가 있습니다. SHA-1을 사용하여 * 고유 한 * 문자열을 찾는 사람은 그 출력이 입력보다 거의 확실하지 않으므로 아마도 잘못된 것을하고있을 것입니다. – ladenedge

+0

@ladenedge SHA1은 정규화 된 값을 만들기위한 등식의 일부라고 생각합니다 (공백이있는 경우 등). – orokusaki

3

uuids는 길고 의미가 없습니다 (예 : uuid로 주문한 경우 의미없는 결과가 발생 함).

너무 길기 때문에 URL에 넣거나 모양이나 형태로 사용자에게 보여주고 싶지 않습니다.

+1

그래,하지만 그게 바로 [shortuuid] (https://github.com/stochastic-technologies/shortuuid)입니다. 엔트로피 모두, 오래 갈 길이 없습니다. –

1

해시는 다른 답변과 함께 불변이어야하는 것들에 정말 좋습니다. 이름은 고유하며 언제든지 첨부 된 내용의 무결성을 검사하는 데 사용할 수 있습니다.

1

다른 종류의 UUID도 적절할 수 있습니다. 예를 들어 식별자를 정렬 할 수있게하려면 UUID1이 부분적으로 타임 스탬프를 기반으로합니다. 모두 응용 프로그램 요구 사항에 관한 것입니다 ...

관련 문제