首页 > 解决方案 > 随机字符串来识别记录?

问题描述

我想做一些类似于 imgur 和大多数其他网站所做的事情:我想在 URL 中使用随机字符串来识别用户正在寻找的任何帖子。

使用这样的随机字符串作为主键可能不是一个好主意,并且确保在用户发送提交时尚未使用随机生成的字符串,会随着时间的推移减慢表的速度,因为它需要检查越来越多的记录以确保没有重复。如何实现这样的随机字符串进行识别?

我的想法,如果这是一个非常糟糕的想法,请告诉我,是有一个充满这些随机字符串的表。该表如下所示:

| submissionId | stringId 
+--------------+----------
| 1            | rbMZV    
+--------------+----------
| 2            | MQyPi    
+--------------+----------
| NULL         | hfXL7

生成这些字符串时,它们没有分配 submitId,例如我的示例表中的“hfXL7”。当用户进行提交时,我的脚本将采用第一个随机生成的尚未分配 submitId 的字符串,并将提交时生成的 submitId 添加到该记录中。我在某处有一个进程定期生成更多字符串,这些字符串可用于人们进行更多提交,因此当有人提交时,总是至少有一个随机生成的字符串没有 submitId。

标签: sqldatabase

解决方案


以下是三种基本方法:

  1. 预先生成并存储所有随机 ID - 足够多,以至于它们永远不可能用完(给定预测的总使用次数)。这里的一个缺点是可能难以预测支持系统生命周期所需的 ID 总数。
  2. 生成足够数量的随机 ID,以在设定的时间段内提供足够多的 ID。然后周期性地产生足够的新的来满足预测的需求。(例如,时间段可能是一天,发电机可能计划在夜间需求低的某个时间点运行。)
  3. 即时生成随机 ID - 仅在需要时生成。

各有利弊:

  • 如果存储不是问题,(1)可能是最简单的选择,因为一旦完成,它就完成了并且永远存在 - 您不必担心失败的作业等。
  • (2) 基本上是您提出的方法:这看起来不错,但这里还有更多需要考虑的事情,例如不可预测的使用高峰、失败的计划作业等。
  • (3) 也可能是简单的并保持精简,因为表格会随着时间的推移而增长,并且无需预测使用情况。这里潜在的缺点是,任何此类函数都会一直生成 ID,直到找到唯一的 ID,因此它可能会随着 ID 数量的增加而变慢——尽管只要不同随机排列的数量是显着大于潜在的使用总数。

上述方法(3)的演示

如何在 MySQL 中实现 on-the-fly 生成器的在线演示:http ://rextester.com/TKGPZ41053

排列数计算

如果是区分大小写的字母数字,则共有 62 个不同的字符。所以每个长度的可能排列数如下:

Characters | Permutations
1          | 62
2          | 3844
3          | 238328
4          | 14776336
5          | 916132832
6          | 56800235584
7          | 3521614606208
8          | 218340105584896
9          | 13537086546263552
10         | 839299365868340224

推荐阅读