Python Time-Ordered UUID
⏱️

Python Time-Ordered UUID

Tags
Dev
Published
Published August 4, 2022

Why?

notion image
UUID1은 시간을 주긴 하지만, 실행하는 장비의 mac 주소가 노출된다는 점 & Multiprocessing 사용시 UUID 순서가 실제 time 순서와 같지 않을수 있다는 점이 이슈가 있다.
Ordered UUID는 기본적으로 random mac 주소 기반의 UUID1을 사용하고, 나오는 형식은 UUID4 형식으로 나와 Django의 UUID Field와 궁합이 맞게 사용할 수 있다.
특히, 이렇게 Time-기반 Ordered UUID를 사용할 경우에, Primary Key로 해당 Column을 사용해주면 별다른 1,2,3..와 같은 ordered pk 없이도 시간순으로 정렬이 가능하다는 점에서 의미가 있다.
 
다만, 이러한 Time based UUID는 시간이 겹치는 부분에서 공통인 부분이 있어서, API Key등으로 사용하면 안된다.
 

OrderedUUID

설치

pip install ordereduuid

사용

from ordereduuid import OrderedUUID uuid = OrderedUUID()
from ordereduuid import OrderedUUID uid = OrderedUUID() uid = "-".join(str(uid).split("-")[:2]) print(f"{uid=}") # 시간부분+UID일부

Django 에서의 사용

from django.db import models from ordereduuid import OrderedUUID class Subscriber(models.Model): uid = models.UUIDField( primary_key=True, default=OrderedUUID, editable=False )
 

TimeFlake

timeflake
anthonynsimonUpdated Jul 19, 2022

설치

pip install timeflake

사용

import timeflake # Create a random Timeflake flake = timeflake.random() >>> Timeflake(base62='00mx79Rjxvfgr8qat2CeQDs') # Get the base62, int, hex or bytes representation flake.base62 >>> '00mx79Rjxvfgr8qat2CeQDs' flake.hex >>> '016fa936bff0997a0a3c428548fee8c9' flake.int >>> 1909005012028578488143182045514754249 flake.bytes >>> b'\x01o\xa96\xbf\xf0\x99z\n<B\x85H\xfe\xe8\xc9' # Convert to the standard library's UUID type flake.uuid >>> UUID('016fa936-bff0-997a-0a3c-428548fee8c9')

Django에서의 사용

from timeflake.extensions.django import TimeflakePrimaryKeyBinary class Item(models.Model): item_id = TimeflakePrimaryKeyBinary() # ...