小弟,现在需要做一个随机卡生成的程序!
随机生成的卡卡号(12位)和密码等相关卡信息要存在数据库中!
并且保证随机卡卡号绝对不能有重复!
如果我每次将生成的12位随机字符那到数据库中循环比较,这样感觉上很笨,我看到资料上有人提到了GUID,不过我使用System.Guid.NewGuid()这个方法以后,生成了一段很长的随机号,因为我不会用GUID,所以请各位给我一些思路提示!
如果要用GUID,谁能帮我提供一些使用资料(给我连接就可以),如果不用GUID,请教各位帮我出出招!谢谢
随机生成的卡卡号(12位)和密码等相关卡信息要存在数据库中!
并且保证随机卡卡号绝对不能有重复!
如果我每次将生成的12位随机字符那到数据库中循环比较,这样感觉上很笨,我看到资料上有人提到了GUID,不过我使用System.Guid.NewGuid()这个方法以后,生成了一段很长的随机号,因为我不会用GUID,所以请各位给我一些思路提示!
如果要用GUID,谁能帮我提供一些使用资料(给我连接就可以),如果不用GUID,请教各位帮我出出招!谢谢
建议LZ自己用Random实现,重复性检测用数据库的Exsits就行,注意把你的卡号设为主键,这样效率很高,
所谓循环性检测好像是要去一个个比似的,不会这样子的
数据库里不是有自动编号吗?
先 插入一条记录,然后获取到刚插入那条记录的编号,其实这就已经不重复了,为了好看,然后对这个编号来个MD5加密码..你不要是12位的嘛,再来个判断
如果取的号1位的,就取这个号的MD5的11位,并在一起
如果取的是2位的,就...............10位,....
同理。然后再修饰一下就完了,
if not exists (select CodeNO from tb where CodeNo=@codeNO)
insert into tb values(@codeNO,@pwd)
用的还是Web应用程序,生成1W笔要9秒时间,10W笔大概1分50秒,感觉也不算慢了,因为只要生成一次,以后就差不多不要再生成了
System.Guid.NewGuid()
"把GUID转为数字取后边的12位,重复的可能性也好小" 我就是想问问,怎么转!
"把GUID转为数字取后边的12位,重复的可能性也好小" 我就是想问问,怎么转!
//字母区分大小写
public string RndNum(int VcodeNum)
{
string Vchar = "0,1,2,3,4,5,6,7,8,9"; string[] VcArray = Vchar.Split(',');
string VNum = "";//由于字符串很短,就不用StringBuilder了
int temp = -1;//记录上次随机数值,尽量避免生产几个一样的随机数 //采用一个简单的算法以保证生成随机数的不同
Random rand = new Random();
for (int i = 1; i < VcodeNum + 1; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
}
//int t = rand.Next(35) ;
int t = rand.Next(35);
if (temp != -1 && temp == t)
{
return RndNum(VcodeNum);
}
temp = t;
VNum += VcArray[t]; }
return VNum;
}
}
还有就是到底银行卡,游戏点卡或手机卡是如何生成的,就是不知道算法有个思路也行!谢谢!
笨呀,多退少补,不会对串操作呀.
lijianlee(素色人生) 你的想法我早就想过了,但是你就能保证你你手工截取的字符串,不重复!
1万张可能不重,10万张,100万呢,按照你的方法,手工可不是很安全!
SQL中的Guid,形式如xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,16位,去掉四位-, 有意义的共12位,也就是说可以有36的12次方个不同的编号,
但当转成12位数字后, 就成10的12次方个了,两者的比值是多少?
36^12 / 10^12 => 3.6^12 * 10^12 / 10^12 => 3.6^12
就是说, 从Guid转为12的数字后, 每一个数字编号可由3.6的12次方个GUID生成,这个冲突性实在是急剧增加了,而非楼上一位说的"把GUID转为数字取后边的12位,重复的可能性也好小"对于卡号的编制,把不冲突希望寄托到GUID的身上是不好的,理论上讲,它是绝不容许重复的,几率必须为0,何况LZ也看到了,想把GUID转成自己期望的格式将会出现更多的问题.考虑算法要结合需求看,在这里,不冲突的重要性是第一的,对于时间,恐怕很充足吧,既然是卡号,就不可能是每个用户要的时候才去生成,而是集中生成的,那怕你生成10W个卡号用了半天时间,我想,这也是许可的,所以,就用随机数生成方式,每生成一个,就去检测冲突,以保证唯一,那怕这个算法再差(也别几分钟一个 :-9 ),只要保证了不冲突,就能成功向BOSS交差了