UUID7是一种按时间排序的UUID,与UUID4相比:
created_at
的列变得多余。请注意,当用作(外部)ID 时,UUID7 会泄漏对象创建时间。不管 这实际上是否存在安全风险,我想知道是否可以使用以下方案来丢弃时间戳信息(失去时间可排序性),同时保留数据库性能:
Python 代码示例:
>>> from uuid import uuid4, UUID
>>> from uuid_extensions import uuid7, uuid_to_datetime
>>> def obfuscate(u1: UUID, u2: UUID) -> UUID:
return UUID(bytes=bytes(a ^ b for a, b in zip(u1.bytes, u2.bytes)))
>>> secret = uuid4()
>>> u1 = uuid7()
>>> u2 = uuid7()
>>> id1 = obfuscate(u1, secret)
>>> id2 = obfuscate(u2, secret)
>>> print(f'\n secrete= {secret}\n u1 = {u1} --> id1 = {id1}\n u2 = {u2} --> id2 = {id2}')
secret = 1bc9e84c-c8d6-47c0-afd3-b78a4333f4bc
u1 = 06732e7b-9aad-7e72-8000-6978adc183a5 --> id1 = 1dbac637-527b-39b2-2fd3-def2eef27719
u2 = 06732473-1b2b-7d9a-8000-f7261455e941 --> id2 = 1dbacc3f-d3fd-3a5a-2fd3-40ac57661dfd
>>> uuid_to_datetime(u1)
datetime.datetime(2024, 11, 12, 5, 29, 29, 667457, tzinfo=datetime.timezone.utc)
>>> uuid_to_datetime(id1) is None
True
只需使用时间戳偏移即可。这是 RFC 9562 允许的。