【问题标题】:Storing random strings without duplicates in a database在数据库中存储没有重复的随机字符串
【发布时间】:2021-08-15 04:47:20
【问题描述】:

我正在生成用作 ID 的字符串,因此为避免重复,我目前必须检查我的数据库是否已经分配了该字符串,如果是,则生成另一个,我想要的是避免计算另一个字符串的返工。

我可以生成和存储所有可能的字符串以更快地分配它们,但我不相信这个想法

你能想出更高效的方法吗?

我编辑:要求要求我使用这种类型的标识符,不是个人的;)

每个 ID 的生命周期为 24 小时

【问题讨论】:

  • Remove a string after it has been chosen.
  • 一个id有多长? id 是否具有特定格式,例如XXX###,其中 X 是字母,# 是数字,还是随机字符序列?范围是 A-Z 还是只是两个字符 AZ
  • 您可以使用 Map(可能是 HashMap)来存储您使用过的 id。将字符串与日期时间一起存储,以便在它们过期时将其清除。
  • 请注意,birthday problem 对于计算需要存储多少状态很有用。即这就是为什么@rzwitserloot 说你需要 128 位,这足以让它不太可能看到任何冲突,直到你开始存储接近 2^64 个标识符

标签: java string random


【解决方案1】:

这是一个非常常见的问题。你的策略听起来是一个非常糟糕的方法。你肯定不是故意要这样做的。

为工作使用正确的工具:让数据库解决这个问题

数据库具有序列/自动递增主键的概念。数据库将只是......照顾它。每当您向数据库添加一行时,根本不指定任何 ID,db 会为您生成一个,并保证它是唯一的。作为CREATE TABLE 语句的一部分,几乎每个数据库都有用于此的简单语法,例如CREATE TABLE foo (id SERIAL);

为工作使用正确的工具:索引

将 ID 设为主键,或者以其他方式告诉数据库您希望它是唯一的(在某些 DB 中,您添加一个 'UNIQUE' 约束。在其他情况下,您使用 CREATE INDEX 为该列添加索引和指定它需要是 DISTINCT 或 UNIQUE - 这些是数据库在 SQL 语法上没有标准化的领域,并且您没有提到您在这里使用的数据库引擎。在网上查找说明并不难) .

完成此操作并尝试使用您以前使用过的 ID 添加一行后,该语句将失败。您可以捕获此 SQLException,然后重新开始并随机生成一个不同的异常。数据库正在使用索引检查,速度非常快。

为工作使用正确的工具:UUID

“我想快速生成一个 ID,但请放心,它绝对、绝对、唯一”如此普遍,已经解决了。认识UUID。 Java 有一个 API 和许多 databases support it natively。所以让你的列输入UUID 而不是VARCHAR

是的,它们很大。如果你想要速度和保证,它需要足够大,以使产生相同 ID 的随机概率如此之低,以至于在宇宙的剩余生命周期中每秒生成一个 ID 仍然不会导致 2 个相同除非你遇到非常不走运(0.000000000000000001% 不走运),否则你需要在问题上投入更多。准确地说是128。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多