我需要生成长度恰好为6(不少于,不多于)的唯一非连续字母数字字符串。 对于非顺序,我的意思是它应该看起来在视觉上是随机的,而不是来自序列(如果你可以在研究了几天之后找到序列,那么它应该只是一见钟情)。 请记住,它必须是独一无二的。 查找已经使用过的所有数字也是不可行的。
我想让数据库生成一个唯一的数字,然后应用一些函数将该数字转换为一个长度为6的唯一非连续字母数字字符串。类似于哈希算法的工作方式,但没有可能的冲突。
我发现了这个:http://blog.maxant.co.uk/pebble/2010/02/02/1265138340000.html 但序列不是视觉上随机的。
答案 0 :(得分:0)
您是否可以将生成的String序列注册到某个数据库/文件/某个位置?然后一种方法可以是每个位置(从1到6),随机选择一个字符并形成你的6个字符串。并查看它是否是注册序列之一。如果已经注册,则生成另一个序列。如果没有注册,那么注册&使用生成的一个用于您的目的。
答案 1 :(得分:0)
通过字母数字,您的目标是[A-Z0-9]
,[a-zA-Z0-9]
还是[a-zA-Z0-9\+\\]
可以接受?在后一种情况下,您可以作弊,将您的唯一ID与适当大的值进行异或,然后通过Base64算法抛出整个批次,从而节省工作。
对于另外两个,从简单的伪随机数生成器的书中取出一个叶子;执行x = ((id + salt)*multiplier) mod pow(alphabet_size,6)
之类的操作,然后将整数x'解码'为字母数字字符。当然,选择一个好的salt
和multiplier
很重要;理想情况下,后者理想情况下是alphabet_size
的一个大素数或至少是互质的。 salt
甚至可以为零,但如果您愿意,可以用来为输出开始更美观的值。
只要初始ID永远不会超过pow(alphabet_size,6)
,哈希将是唯一可逆的。您需要将哈希值转换回整数,然后使用模块化除法算法重新获取(id + salt)
,从而获得原始id
。