mysql - 如何在不检查数据库中是否存在的情况下生成 8 个字符的唯一字符串

标签 mysql ruby-on-rails algorithm unique uniqueidentifier

我想每天生成100万个二维码。每个二维码都应该有随机唯一值。为了实现唯一性,我有如下两个选项

1)第一个选项是生成 8 个字符的字母数字随机字符串并检查它是否存在于数据库中。如果不存在则存储在数据库中,如果存在则重试获取。

这种方法的问题是生成 100 万个唯一的字母数字字符串大约需要 45 分钟,因为我们必须每次检查生成的字母数字字符串是否存在于数据库中。

2) 第二个选项是通过附加 6 个字符的字母数字字符串和时间(小时+分钟+秒+日期+月+年)来生成唯一 token 。使用此选项,我能够在 5 分钟内生成 100 万个唯一的字母数字字符串。

我正在使用第二个选项,但此选项的问题是由此生成的字母数字字符串长度为 15 个字符。我想生成只有 8 个字符长的字母数字字符串。如果我使用第二个选项,那么时间戳本身需要 8 个字符,并且字符串很容易被猜到。

我想知道如何在不检查数据库中是否存在的情况下生成 8 个字符的随机且唯一的字母数字字符串。

最佳答案

使用set结构就够了

def random_str(n):
    base = 'abcefghijklmnopqrstuvwxzy0123456789'
    return ''.join([base[ord(i) % len(base)] for i in os.urandom(n)])

s = set()
SIZE = 1000000
while len(s) < SIZE:
    s.add(random_str(5))

而且,它大约需要 5 秒。

对不起,我每天都在思念。将8个字符拆分为拖尾部分:第一部分(3个字符)表示每天或其他条件,可以将其存储在Mysql中并在生成一次或使用1970年以来的天数之前查询并将其更改为基于36的数字。秒部分 5 个字符使用上面的代码生成唯一键。

关于mysql - 如何在不检查数据库中是否存在的情况下生成 8 个字符的唯一字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35193730/

相关文章:

mysql 使用 select sum() 从另一个表更新一个表

php - 邻近搜索

mysql - 不正确的整数值 : '' for column

ruby-on-rails - ActionMailer 中的 relative_url_root

ruby-on-rails - rails 5 : Database design with iterations

algorithm - 最大重叠点

mysql - 如何使用微软工具SSIS 2005将数据从SQL Server传递到mysql?

ruby-on-rails - rails/Papertrail : Changeset with association changes

c++ - 我的排序算法的时间复杂度是多少?

c - 以邻接矩阵作为参数的 Prim MST