对长度 4 使用 UUID 四次是否与对长度 16 使用一次 UUID 相同?

问题描述

我的情况是这样的,我需要为人们提供一个他们可以用来登录的一次性代码。这些人不懂技术。他们需要获得人类可读的代码

格式与此类似;

ACBE-adK3-SdLK-K23J

一组 4 乘以 4 的人类可读字符。对于总共 16 个字符,作为 UUID 似乎是合理的安全。但如果需要,可以轻松扩展。

现在,使用NanoID 4 次来生成一个4 个字符的长字符串是否等同于使用一次NanoID 生成一个16 个字符的字符串然后将其切碎?我觉得是这样的。以编程方式实现两者都是微不足道的。但是,我真的很想知道实际的事实答案。如果某个数学专家会放纵我?

编辑: 回答问题;

  • 这是为了让人们只能访问他们应该访问的照片,例如护照照片、学校照片等。人们使用该代码一次将照片链接到他们的电子邮件,并从他们使用电子邮件/密码组合登录链接在这种情况下,让人们事先使用电子邮件注册不是一种选择。
  • 我知道使用十六进制数字是常见的情况。我需要简单的人类可读。因此,将 16 位十六进制块切成 4 个不同的部分似乎是合乎逻辑的步骤。
  • 选择的字母是 a-z A-Z 0-9,不包括一些符号,例如 0/o/O 和 I/1/l,以限制错误。这将允许用更少的字符表达相同的 ID。
  • 我现在知道,NanoID 不是 UUID 实现。比。但对于我的目标,我认为就足够了。如果没有,我也想知道。
  • 我使用的是 Python 3

解决方法

诸如您在问题中给出的字符串格式最终是从整数到人类可读字符串的一对一映射。如果生成的整数是唯一的,那么人类可读的字符串也是唯一的。

在你的情况下,你可以在区间 [0,AS) 中生成一个统一的随机整数,其中 A 是字母大小(例如大写字母和数字为 36),S 是 ID 中的字符数(在您的示例中为 16,不包括连字符)。然后将该整数与人类可读字符串以所需格式进行一对一映射。

在您的情况下,ID 将用作秘密的“确认代码”,在这种情况下,应使用安全随机生成器生成,例如 secrets.SystemRandomrandom.SystemRandom 或 {{1} } 在 Python 中。