UUID는 언제 사용해야 합니까?uuid1() 대 uuid.python으로 uuid4()를 지정합니다.
나는 의사로부터 그 둘의 차이를 이해한다.
uuid1()
:
호스트 ID, 시퀀스 번호 및 현재 시각에서 UUID를 생성합니다.
uuid4()
:
랜덤 UUID를 생성합니다.
그렇게uuid1
는 머신/시퀀스/시간 정보를 사용하여 UUID를 생성합니다.각각의 사용의 장점과 단점은 무엇입니까?
알고있어요uuid1()
사생활에 대한 우려가 있을 수 있습니다. 왜냐하면 그건 기계 조작에 기반을 두고 있기 때문입니다.둘 중 하나를 선택할 때 더 미묘한 것이 있는지 궁금합니다.그냥 쓰는 거예요.uuid4()
완전 랜덤 UUID니까근데 이걸 써야 되나?uuid1
충돌 위험을 줄이기 위해 사용되었습니다.
기본적으로 둘 중 하나를 사용하는 모범 사례에 대한 사람들의 팁을 찾고 있습니다.감사합니다!
uuid1()
는 콜리젼을 생성하지 않을 것을 보증합니다(동시에 너무 많은 콜리젼을 작성하지 않는 것을 전제로 하고 있습니다).만약 중요한 일이라면 사용하지 않을 거예요uuid
컴퓨터 간에 고유하게 하기 위해 MAC 주소가 사용됨에 따라 컴퓨터에도 적용됩니다.
100ns 미만으로 2개 이상의14 uid1을 생성하여 중복을 생성할 수 있지만 대부분의 사용 사례에서는 문제가 되지 않습니다.
uuid4()
는, 말씀하신 대로 랜덤 UUID 를 생성합니다.충돌할 확률은 정말, 정말, 정말 작습니다.걱정할 필요 없을 정도로 작아요.문제는 불량 난수 생성기로 인해 충돌이 발생할 가능성이 높아진다는 것입니다.
밥 에이먼의 이 훌륭한 답변은 잘 요약되어 있다. (나는 전체 답을 읽을 것을 권한다.)
솔직히 말하면, 악의적인 행위자가 없는 단일 애플리케이션 공간에서는 버전 4 UUID에서도 충돌이 발생하기 훨씬 전에 지구상의 모든 생명체가 멸종합니다. 초당 꽤 많은 UUID를 생성하더라도 말입니다.
한 가지 예를 들 수 있습니다.uuid1()
보다는uuid4()
UUID가 개별 머신에서 생성되는 경우, 예를 들어 여러 온라인 트랜잭션이 스케일링 목적으로 여러 머신에서 처리되는 경우입니다.
이러한 상황에서는 예를 들어 의사난수생성기의 초기화 방법에 대한 선택이 불충분하고 생성된 UUID의 수가 많을 경우 중복 ID가 생성될 가능성이 높아집니다.
또 다른 관심사는uuid1()
이 경우, 각 GUID가 최초로 생성된 머신은 암묵적으로 (UUID의 '노드' 부분에) 기록됩니다.및 시간 정보는 디버깅만 하면 도움이 될 수 있습니다.
저희 팀은 데이터베이스 업그레이드 스크립트에 UUID1을 사용하는 데 어려움을 겪었습니다. UUID는 몇 분 안에 최대 12만 개까지 생성되었습니다.UUID 충돌로 인해 기본 키 제약 조건이 위반되었습니다.
100대의 서버를 업그레이드했지만 Amazon EC2 인스턴스에서 이 문제가 여러 번 발생했습니다.불량한 클럭 해상도와 UUID4로의 전환으로 문제가 해결된 것 같습니다.
사용 시 주의사항uuid1
디폴트 콜을 사용하는 경우(지정하지 않고)clock_seq
파라미터) 충돌할 가능성이 있습니다.랜덤성이 14비트밖에 없습니다(100ns 내에 18개의 엔트리를 생성하면 충돌 확률이 약 1%입니다).생일 패러독스/공격 참조.대부분의 경우 이 문제는 발생하지 않지만 클럭 해상도가 낮은 가상 시스템에서는 문제가 발생할 수 있습니다.
아마도 언급되지 않은 것은 지역적인 것일 것이다.
MAC 주소 또는 시간 기반 순서(UUID1)를 사용하면 랜덤하게 분산된 번호(UUID4)보다 근접하게 번호를 정렬하는 작업이 적기 때문에 데이터베이스 성능을 향상시킬 수 있습니다(여기를 참조).
두 번째 관련 문제는 원본 데이터가 손실되거나 명시적으로 저장되지 않은 경우에도 UUID1을 사용하면 디버깅에 도움이 된다는 것입니다(이는 명백히 OP에 의해 언급된 프라이버시 문제와 모순됩니다).
인정된 답변 외에 경우에 따라서는 도움이 되는 세 번째 옵션이 있습니다.
랜덤 MAC('v1mc') 탑재 v1
랜덤 브로드캐스트 MAC 주소를 사용하여 의도적으로 v1 UUID를 생성함으로써 v1과 v4 간에 하이브리드를 만들 수 있습니다(이는 v1 사양에 의해 허용됩니다).결과 v1 UUID는 시간에 따라 달라지지만(일반 v1과 같음), 모든 호스트별 정보(예: v4)가 부족합니다.v1mc = 시간 60비트 + 임의 61비트 = 고유 비트 121비트, v4 = 122비트 등 충돌 저항도 v4에 훨씬 가깝습니다.
처음 접한 곳은 Postgres의 uuid_generate_v1mc() 함수입니다.그 후 다음과 같은 python을 사용하고 있습니다.
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)
언급URL : https://stackoverflow.com/questions/1785503/when-should-i-use-uuid-uuid1-vs-uuid-uuid4-in-python
'programing' 카테고리의 다른 글
열을 Base64에서 문자열로 업데이트(SQL 네이티브) (0) | 2022.11.03 |
---|---|
b-nav-item의 부트스트랩-vue 문제, 색상을 변경할 수 없음 (0) | 2022.11.03 |
npm 설치 시 최대 콜스택 크기를 초과했습니다. (0) | 2022.10.14 |
virtualenv가 글로벌 사이트 패키지에서 특정 패키지를 상속하도록 설정 (0) | 2022.10.14 |
Python의 mkdir -p 기능 (0) | 2022.10.14 |