生成确认号码

时间:2009-12-03 20:40:46

标签: algorithm

我需要一种技术(如果你有一个指向示例代码的指针)来生成Web支付的构造数字。我不希望客户写下像GUID这样的长序列,但我不希望它也很容易预测。

使用C#

感谢您的所有提示。 我决定采用这样的格式:

TdddRROOO

T = 2009(明年将是U = 2010) ddd =今年的天数 RR =两个随机数 000 =订单号(我会抵消这个,所以人们不知道当天的订单号)

所以确认号码会是这样的 P23477098

6 个答案:

答案 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)这样的库来生成随机短语,或者编写自己的实用程序。然后只需使用简单的哈希函数将“确认短语”转换为可以索引的数字。

对于C#,在http://github.com/slashdotdash/faker-cs

存在一个端口Ruby的Faker gem