我需要一种技术(如果你有一个指向示例代码的指针)来生成Web支付的构造数字。我不希望客户写下像GUID这样的长序列,但我不希望它也很容易预测。
使用C#
感谢您的所有提示。 我决定采用这样的格式:
TdddRROOO
T = 2009(明年将是U = 2010) ddd =今年的天数 RR =两个随机数 000 =订单号(我会抵消这个,所以人们不知道当天的订单号)
所以确认号码会是这样的 P23477098
答案 0 :(得分:3)
你可以用混合物做点什么。生成密钥的前半部分作为已知的可预测值(例如00001,00002,00003等),然后将后半部分生成为随机生成的值,以使其不可预测。然后,递增“已知的,可预测的”值,以便永远不会得到匹配。
您的唯一代码将变为:00001-53481,00002-43853,00003-54511等。
当然,我确信那里有可能已经存在的库。 (如果您指定使用的语言,可能会有所帮助。)
答案 1 :(得分:2)
我最近在PHP中做了同样的事情。我们在这个类中使用随机函数,
https://gallery.svn.sourceforge.net/svnroot/gallery/trunk/eval/gx/kohana/kohana/helpers/text.php
我们使用random('distinct', 8)
生成确认号码。它生成这样的字符串,
4CFY24HJ
JH5AYL7J
2TVWTMJ5
正如你所看到的,它没有像(1 / l,0 / O等)那样容易混淆的数字/字母,因此当客户必须通过电话阅读数字时,它会更加清晰。
答案 2 :(得分:1)
在确认码中确定所需的字符(char[] chars
),确定确认码的长度(n
),生成n
个随机数({{1} } {,i_1
,... i_2
)在i_n
范围内,并返回字符串[0..chars.Length)
。
在C#中:
chars[i_1]chars[i_2]...chars[i_n]
对于唯一性,请以public string ConfirmationCode(char[] chars, int length, Random rg) {
StringBuilder codeBuilder = new StringBuilder();
for(int i = 0; i < length; i++) {
int index = rg.Next(chars.Length);
codeBuilder.Append(chars[index]);
}
return codeBuilder.ToString();
格式添加当前时间。
答案 3 :(得分:0)
例如,只需生成100000到999999之间的随机数。另外一个好主意是在前面加上一些字母,标识它是一个确认号码,例如CONF-843682,以便人们在你要求时更容易识别它。
将号码存储在数据库中,同时存储订单的ID和有效期(比如1年)。
答案 4 :(得分:0)
你可以做一些事情,比如获取指定长度的随机数,转换为base64并添加校验和字符。
答案 5 :(得分:0)
像亚马逊的PayPhrase这样的东西怎么样?使用像Faker(Ruby)或Data :: Faker(Perl)这样的库来生成随机短语,或者编写自己的实用程序。然后只需使用简单的哈希函数将“确认短语”转换为可以索引的数字。
存在一个端口Ruby的Faker gem