2

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

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

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

4

2 回答 2

0

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

于 2012-02-09T17:06:01.963 回答
0

您的目标是字母数字[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.

于 2012-02-09T17:15:20.397 回答