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

标签 java mysql database performance random

我正在寻找一些关于效率和实现难易程度的见解,以实现我的某个目标。我有一个存储用户信息的 MySQL 表。创建帐户时,他们需要从 00000-99999 获取自己的唯一随机 5 位代码。

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

  • 使用 00000-99999 中的所有 5 位代码以随机顺序填充 company_id 列。这是我到目前为止所做的。我的问题是,当有人创建帐户时,我需要查询数据库以找到第一个打开的行并获取与之关联的 5 位代码。到目前为止,我还没弄清楚那部分。
  • 使用 00000-99999 中的所有 5 位代码按数字顺序填充 company_id 列。当有人创建帐户时,我会随机选择一个 open 行并获取与之关联的 5 位数代码。这里的问题是选择一个打开的随机行。同样,我不知道如何完成此任务。
  • 在用户创建新帐户时创建 5 位代码,并在我的 user_data 中创建一个新行,并将该 5 位代码作为 company_id 列。这里的问题是创建新帐户的程序必须能够访问 尚未使用 的 5 位代码列表。我认为这可能是最好的选择,通过创建 5 位代码 00000-99999 的数组,用 company_id 列中所有当前使用的 5 位代码填充数组,删除第一个中的所有元素匹配第二个元素的数组,然后从更改后的第一个数组中选择一个随机的 5 位代码。

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

最佳答案

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

如果您希望密度较低,那么生成一个随机数并根据现有数进行检查可能是您的最佳选择。您的冲突率将足够低,不会真正影响性能。

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

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

但最好的方法是不对 id 值使用随机数;上面的示例更加复杂,因为需要处理多个数据库客户端可能争用同一个未使用的公司 ID 的竞争条件。

关于java - 如何在 MySQL 中创建不重复的随机用户 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54355462/

相关文章:

php - MySQL查询使用另一个页面的查询结果 - php

javascript - 如何从mongodb中选择一个字段不等于某一值的所有文档

mysql - 如何更改mysql中的数据库排序规则

java - java.util.Date 类的 Struts2 类型转换的奇怪行为

java - 比较排序算法

java - Jetty - WebSocket.sendMessage(String data) 和 void sendMessage(byte frame,String data) 有什么区别?

mysql - 当有新的 mysql 记录插入表中时创建 Node.js 事件监听器(用于通知提要)

mysql - 将表从 latin1 转换为 UTF-8,键过大的问题

database - Apache Felix 无法访问 Postgres JDBC

java - 获取可能的实例/对象类型