几个月前,我的任务是为我们的Web应用程序实现一个独特的随机代码.代码必须是用户友好的并且尽可能小,但仍然基本上是随机的(因此用户无法轻易预测序列中的下一个代码).
它最终生成的值看起来像这样:
Af3nT5Xf2
不幸的是,我对实施从未满意.Guid是不可能的,它们对于用户来说太大而且难以输入.我希望能够提供更多的4或5个字符/数字的内容,但是如果我们编码为的话,我们的特定实现会生成明显的图案序列少于9个字符.
这是我们最终做的事情:
我们从数据库中提取了一个唯一的顺序32位id.然后我们将它插入64位RANDOM整数的中心位.我们创建了一个易于键入和识别的字符的查找表(AZ,az,2-9跳过容易混淆的字符,如L,l,1,O,0等).最后,我们使用该查找表对64位整数进行base-54编码.高位是随机的,低位是随机的,但中心位是顺序的.
最终结果是一个比guid小得多的代码并且看起来是随机的,即使它绝对不是.
我对此特定实现从未满意.你们会做什么?
我就是这样做的.
我将获得一个常用英语单词列表,其中包含使用频率和一些语法信息(如名词或动词?).我想你可以看看intertubes周围的一些副本.Firefox是开源的,它有一个拼写检查程序......所以它必须以某种方式获得.
然后我会在其上运行一个过滤器,这样就可以删除模糊的单词并排除那些太长的单词.
然后我的生成算法将从列表中选择2个单词并连接它们并添加一个随机的3位数字.
我也可以在动词/名词之间随机化单词选择模式
eatCake778
pickBasket524
rideFlyer113等.
案件不一定是驼峰套管,你也可以随机化.您还可以随机化数字和动词/名词的位置.
而且由于这是很多随机化,杰夫的Naïveté的危险是必读的.还要确保提前学习字典攻击.
在我实现它之后,我会进行测试以确保我的算法永远不会发生碰撞.如果碰撞率很高,那么我会玩参数(使用的名词数量,使用的动词数量,随机数的长度,单词总数,不同类型的外壳等)