在 UUID v7 中混淆时间戳

问题描述 投票:0回答:1

UUID7是一种按时间排序的UUID,与UUID4相比:

  1. 用作数据库中的主键时不会降低性能(例如此基准测试)。
  2. 包括其创建时间戳,这使得类似
    created_at
    的列变得多余。

请注意,当用作(外部)ID 时,UUID7 会泄漏对象创建时间。不管 这实际上是否存在安全风险,我想知道是否可以使用以下方案来丢弃时间戳信息(失去时间可排序性),同时保留数据库性能:

  1. 生成一个秘密UUID4。
  2. 插入新对象时,生成新的 UUID7,并与秘密 UUID 进行按位异或。
  3. 使用结果作为对象的 ID(和主键)

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

database primary-key uuid uuid7
1个回答
0
投票

只需使用时间戳偏移即可。这是 RFC 9562 允许的

请参阅https://habr.com/ru/articles/855832/与翻译

© www.soinside.com 2019 - 2024. All rights reserved.