【问题标题】:Generate unique non-sequential alphanumeric string of length 6生成长度为 6 的唯一非连续字母数字字符串
【发布时间】:2012-03-02 03:55:20
【问题描述】:

我需要生成长度为 6 的唯一非连续字母数字字符串(不是更少,也不是更多)。 对于非序列,我的意思是它乍一看应该在视觉上是随机的,而不是来自一个序列(在学习了几天后你是否能找到序列并不重要,它应该只是乍一看是随机的)。 请记住,它必须是独一无二的。 查找所有已经使用的号码也是不可行的。

我正在考虑让数据库生成一个唯一数字,然后应用一些函数将该数字转换为长度为 6 的唯一非连续字母数字字符串。类似于散列算法的工作原理,但不会发生冲突。

我发现了这个:http://blog.maxant.co.uk/pebble/2010/02/02/1265138340000.html 但序列在视觉上并不是随机的。

【问题讨论】:

    标签: security random unique alphanumeric nonsequential


    【解决方案1】:

    您是否可以将生成的字符串序列注册到某个数据库/文件/某个地方?然后一种方法可以是针对每个位置(从 1 到 6),随机选择一个字符并形成您的 6 个字符串。并查看它是否是注册序列之一。如果已经注册,则生成另一个序列。如果未注册,则注册并使用生成的用于您的目的。

    【讨论】:

    • 如果系统已经运行了一段时间,那将需要多次重试。
    【解决方案2】:

    通过字母数字,您是针对[A-Z0-9][a-zA-Z0-9] 还是[a-zA-Z0-9\+\\] 可以接受?在后一种情况下,您可以作弊,将您的唯一 ID 与适当大的值进行异或运算,然后通过 Base64 算法抛出整个批次,从而节省工作量。

    对于其他两个,从简单的伪随机数生成器的书中取一页;执行类似x = ((id + salt)*multiplier) mod pow(alphabet_size,6) 的操作,然后将整数 x 解码为字母数字字符。当然选择好的saltmultiplier很重要;理想情况下,后者将是一个大素数,或者至少是alphabet_size 的互质数。 salt 甚至可以为零,但如果您愿意,可用于从更美观的输出值开始。

    只要初始 id 不超过pow(alphabet_size,6),哈希值将是唯一可逆的。您需要将哈希转换回整数,然后使用模块化除法算法重新获得(id + salt),从而获得原始id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2017-01-14
      • 2011-08-18
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多