代码之家  ›  专栏  ›  技术社区  ›  Riley Fitzpatrick

如何在MySQL中创建不重复的随机用户ID?

  •  1
  • Riley Fitzpatrick  · 技术社区  · 7 年前

    我正在寻找对效率和实现的易用性的一些洞察,我有一个特定的目标。我有一个mysql表存储用户信息。创建帐户时,他们需要获得自己的 独特的 从00000到99999随机5位数字代码。

    以下是我正在考虑的策略。其中一些看起来很困难(对于像我这样的初学者来说),所以我只想咨询stack overflow以获取任何建议。

    • 填充 company_id 以随机顺序列出00000-99999之间的所有5位代码的列。这就是我迄今为止所做的。我的问题是,当有人创建帐户时,我需要查询数据库以找到第一个打开的行,并获取与之相关联的5位代码。到目前为止,我还没弄清楚那部分。
    • 填充 公司会员 以数字顺序显示00000-99999中所有5位代码的列。当有人创建帐户时,我会随机选择 打开 行并获取与其关联的5位代码。这里的问题是选择一个打开的随机行。再说一次,我不知道我将如何实现这一点。
    • 当用户创建新帐户并在我的 user_data 用那5位数字作为 公司会员 列。这里的问题是,创建新帐户的程序必须能够访问5位代码的列表 尚未使用 . 我认为这可能是最好的选择,通过创建一个5位代码的数组00000-99999,在数组中填充当前使用的所有5位代码 公司会员 列,删除第一个数组中与第二个数组中的元素匹配的所有元素,然后从更改后的第一个数组中选择一个随机的5位代码。

    我要问的是,在创建新帐户(不想让用户等待)时,在效率方面,哪一个(这些策略或您自己的策略)最好,而且最重要;其次,在易于实现方面。事先谢谢!

    3 回复  |  直到 7 年前
        1
  •  1
  •   Uueerdo    7 年前

    对于如此小的范围,如果您必须选择其中一个(而不是两者的组合),那么最好还是保留一个未使用的数字列表。好吧,这真的取决于你期望的使用上限与总的可能值成比例。

    如果您期望低密度,那么生成一个随机数并对照现有的数进行检查可能是您最好的选择。您的碰撞率将足够低,不会真正影响性能。

    如果您期望高密度,那么保留未使用的数字列表并从中随机选择是更好的选择,因为备选方案可能非常可怕。考虑到最坏的情况,当只剩下一个数字时,使用低密度方法意味着您必须生成并丢弃范围内一半的数字,以便有50%的机会找到未使用的数字。

    最好的方法是在范围填充时切换方法;当使用50%时,您很可能会在两个随机数代中找到一个可用的数字;但是在某些完整性点(当剩余的数字很少时),最好切换。

    但最好的方法是不要对ID值使用随机数;上面的例子由于需要处理竞争条件而变得更加复杂,因为多个数据库客户机可能会争夺相同的未使用的公司ID。

        2
  •  1
  •   APC    7 年前

    最简单的解决方案是定义 company_id 作为自动递增的标识符列:

    create table USER_DATA (
      company_id int not null auto_increment,
      .... other columns here
      primary key (company_id)
    );
    

    这是非常有效的,对你来说似乎很重要。此外,它是生成一系列有保证的唯一数字的标准方法,从长远来看,这将使每个人的生活更容易。真 公司会员 是单调递增的,而不是随机分配的,但是随机ID究竟有什么好处?实际上,没有人关心ID是否是随机数。

        3
  •  0
  •   Rick James diyism    7 年前

    用数字按随机顺序构建表。(如果有困难,我会解释。)

    BEGIN;
    SELECT number FROM tbl LIMIT 1 FOR UPDATE;
    DELETE FROM tbl WHERE number = << the value from the SELECT >>
    COMMIT;
    

    这将为您提供“下一个”号码,然后将其删除。事务是为了避免两个连接获得相同的号码。