uuid4 - python uuid 4




파이썬에서 언제 uuid.uuid1()과 uuid.uuid4()를 사용해야합니까? (4)

수락 된 답변 외에도 경우에 따라 유용 할 수있는 세 번째 옵션이 있습니다.

v1 (임의의 MAC) ( "v1mc")

임의로 브로드 캐스트 MAC 주소로 v1 UUID를 의도적으로 생성하여 v1과 v4를 혼용 할 수 있습니다 (v1 사양에서 허용). 결과 v1 UUID는 시간에 따라 다르지만 (v1처럼) 호스트 별 정보 (예 : v4)가 부족합니다. 또한 v1mc = 60 비트 + 61 임의 비트 = 121 고유 비트; v4 = 122 랜덤 비트.

내가 처음 발견 한 곳은 Postgres의 uuid_generate_v1mc() 함수입니다. 이후 나는 다음과 같은 파이썬을 사용했습니다 :

from os import urandom
from uuid import uuid1
_int_from_bytes = int.from_bytes  # py3 only

def uuid1mc():
    # NOTE: The constant here is required by the UUIDv1 spec...
    return uuid1(_int_from_bytes(urandom(6), "big") | 0x010000000000)

(참고 : 나는 UUID 객체를 직접 생성하는 더 길고 더 빠른 버전을 가지고 있으며, 원하는 사람이 있으면 게시 할 수 있음)

대용량의 통화 / 초의 경우, 이는 시스템 임의성을 소모 할 가능성이 있습니다. 대신에 stdlib random 모듈을 사용할 있습니다 (더 빨라질 수도 있습니다). 그러나 경고 : 공격자가 RNG 상태를 결정할 수 있기 전에 불과 수백 백 개의 UUID가 필요하므로 향후 UUID를 부분적으로 예측할 수 있습니다.

import random
from uuid import uuid1

def uuid1mc_insecure():
    return uuid1(random.getrandbits(48) | 0x010000000000)

필자는이 두 docs. 의 차이점을 docs. 에서 이해합니다 docs.

uuid1() :
호스트 ID, 시퀀스 번호 및 현재 시간에서 UUID 생성

uuid4() :
임의의 UUID를 생성합니다.

따라서 uuid1 은 기계 / 시퀀스 / 시간 정보를 사용하여 UUID를 생성합니다. 각각의 장점과 단점은 무엇입니까?

uuid1() 은 컴퓨터 정보를 기반으로하므로 개인 정보 보호 문제가 발생할 수 있음을 알고 있습니다. 하나 또는 둘 다를 선택할 때 더 미묘한 것이 있는지 궁금합니다. 지금은 uuid4() 사용하고 있습니다. 완전히 임의의 UUID이기 때문입니다. 하지만 충돌의 위험을 줄이기 위해 uuid1 을 사용 uuid1 궁금합니다.

근본적으로, 나는 하나를 사용하는 것에 대한 모범 사례에 대한 사람들의 팁을 찾고있다. 감사!


아마 언급되지 않은 무언가는 지역의 것입니다.

MAC 주소 또는 시간 기반 주문 (UUID1)은 무작위로 배포 된 것 (UUID4)보다 숫자를 더 가깝게 정렬하는 작업이 적기 때문에 데이터베이스 성능을 향상시킬 수 있습니다 ( here 참조).

두 번째 관련 문제는 원본 데이터가 손실되거나 명시 적으로 저장되지 않은 경우에도 UUID1을 사용하는 것이 디버깅에 유용 할 수 있다는 것입니다 (이는 OP에서 언급 한 개인 정보 보호 문제와 분명히 충돌합니다).


한 가지주의해야 할 것은 uuid1 을 사용할 때 clock_seq 매개 변수없이 기본 호출을 사용하면 uuid1 가능성이 있습니다. 14 비트의 무작위성 (100ns 내에서 18 개의 항목을 생성하면 약 1 %의 충돌은 생일 역설 / 공격을 참조). 대부분의 유스 케이스에서는 문제가 발생하지 않지만 클럭 해상도가 낮은 가상 시스템에서는 문제가 발생합니다.


uuid1() 대신 uuid1() 고려할 수있는 한 가지 예는 UUID가 별도의 시스템 에서 생성되는 경우입니다. 예를 들어 여러 온라인 트랜잭션이 여러 시스템에서 확장 목적으로 처리되는 경우입니다.

이러한 상황에서, 예를 들어 의사 난수 생성기가 초기화되는 방식에서 잘못된 선택으로 인해 충돌이 발생할 수있는 위험과 생성 된 잠재적으로 더 많은 수의 UUID가 중복 ID를 만들 가능성이 높아집니다.

이 경우 uuid1() 의 또 다른 관심은 각 GUID가 처음 생성 된 머신이 (UUID의 "노드"부분에) 암시 적으로 기록된다는 것입니다. 이 시간 정보는 디버깅 할 때만 도움이 될 수 있습니다.







uuid