0

我需要为我的用例生成 UID(字母数字),但只要我们希望 UID 是随机但可管理的,最多应该是 7 个字符,例如PNR (CYB6KL)。现在,如果我没记错的话,我可以生成一个很小的随机 UID,但唯一性可能会因为冲突(生日悖论)而受损,因此对于 32 位,50% 的冲突概率约为 77k UID 代。

所以本质上,我需要一种生成 UID 的方法:

  1. 小(最多 7 个字符)
  2. 随机的
  3. 独特的
  4. 不需要查找以前的存在。

我将将此 UID 存储在数据库列中,并且 UID 必须是唯一的。它不会是表的主键,现在是自动生成的 ID。

我正在考虑一些类似的东西,但我不确定独特性。

BigInteger big = new BigInteger(32, new SecureRandom());
return big.toString(32).toUpperCase();

非常感谢任何可能对此有所帮助的想法。世代必须是唯一的。

提前致谢。

4

1 回答 1

0

为此,您可以使用像hashids这样的库,它实现了双态翻译,可以将数值编码为带有自定义字母表的字符串代码。这应该完全符合您的要求。如果您需要它是遍历安全的,您应该使用某种SecureRandom作为基础数值的源。如果没有,您甚至可以基于您已经拥有的自动增量值。重用主键的好处是您可以只翻译字符串代码并通过主键进行查找。

于 2021-09-20T08:20:33.593 回答