在表格中生成最短的随机唯一字母字符串

时间:2016-03-18 17:07:21

标签: mysql random

我在表格中有许多记录,需要找到一种方法来分配一些

的唯一代码
  • 应该是唯一的;
  • 应仅包含小写字母(无数字),因此人们可以通过电话使用语音字母提及记录代码,例如 - "嗨,这是John,我的代码是:alpha zulu威士忌狐步石&#34 ;;
  • 应尽可能短。

记录的截止日期约为2周,然后将其删除。

新记录以每天数千的速度不断创建。该表每秒获得几千个选择。

理想情况下,这应该仅在SQL中发生,因此我可以在插入&#34;之前将其添加到&#34;触发而不是点击数据库,选择检查应用程序端生成的代码的唯一性,这就是我现在正在玩的并且可能带来很大的开销,我甚至不会在这里发布代码。< / p>

1 个答案:

答案 0 :(得分:2)

将整数主键转换为基数为26的数字...也就是字母。

0  becomes a
1  becomes b
25 becomes z
26 becomes aa
27 becomes ab

无需将此表示存储在数据库中,将其存储为整数并将其转换为显示级别的字母。

因为主键递增这不是特别安全,所以可以猜到。

如果您希望代码过期而不是相关数据,请创建第二个表,该表存储代码(创建时)和外键返回数据。使用INSERT触发器添加代码。

CREATE TABLE user_codes (
    code     INTEGER PRIMARY KEY AUTO_INCREMENT,
    uid      INTEGER FOREIGN KEY users(id),
    created  TIMESTAMP 
);

如上所述,将整数代码转换为基数26,其中数字都是字母。

这也可以保护用户的主键,有人可能会做出恶意的事情,最好不要泄漏。

这也不是特别安全,可以猜到。您可以使用the technique in this answer to pick unique random numbers来改进它。

如果它必须是随机且唯一的,请考虑使用UUID_SHORT()调用来生成唯一的64位数,这基本上是时间加上服务器ID。然后将其转换为基数26,然后转换为字母。不幸的是,这需要14个字母。

...但是因为它是基于时间的,所以这也不是特别安全,可以猜到。

最后,问问自己代码是否必须是全局唯一的,或者是否足以让人知道特定帐户的代码。例如,验证码。