小弟,现在需要做一个随机卡生成的程序!
    随机生成的卡卡号(12位)和密码等相关卡信息要存在数据库中!
    并且保证随机卡卡号绝对不能有重复!
    
    如果我每次将生成的12位随机字符那到数据库中循环比较,这样感觉上很笨,我看到资料上有人提到了GUID,不过我使用System.Guid.NewGuid()这个方法以后,生成了一段很长的随机号,因为我不会用GUID,所以请各位给我一些思路提示!
如果要用GUID,谁能帮我提供一些使用资料(给我连接就可以),如果不用GUID,请教各位帮我出出招!谢谢

解决方案 »

  1.   

    sqlserver中不是有定义好的NewGuid
      

  2.   

    楼上的朋友,我不知道GUID怎么用啊,SQL里面有这个我知道,但是我要生成不重复的12位卡号,该怎么做!
      

  3.   

    不敢确信Guid能否生成仅12位的字符串,按理说是不行的,因为12字符所能包含的信息可能不是那么够,
    建议LZ自己用Random实现,重复性检测用数据库的Exsits就行,注意把你的卡号设为主键,这样效率很高,
    所谓循环性检测好像是要去一个个比似的,不会这样子的
      

  4.   

    那你们说,象银行卡,游戏点卡,他们是怎么生成的呢?他们生成的卡好也不是GUID直接生成的!我这个地方不懂啊,没有办法做!
      

  5.   

    你不是存在数据库里嘛
    数据库里不是有自动编号吗?
    先 插入一条记录,然后获取到刚插入那条记录的编号,其实这就已经不重复了,为了好看,然后对这个编号来个MD5加密码..你不要是12位的嘛,再来个判断
    如果取的号1位的,就取这个号的MD5的11位,并在一起
    如果取的是2位的,就...............10位,....
    同理。然后再修饰一下就完了,
      

  6.   

    我以前做的是直接用获取(0-9)随机数,把卡号设为主键。
    if not exists (select CodeNO from tb where CodeNo=@codeNO)
    insert into tb values(@codeNO,@pwd)
    用的还是Web应用程序,生成1W笔要9秒时间,10W笔大概1分50秒,感觉也不算慢了,因为只要生成一次,以后就差不多不要再生成了
      

  7.   

    把GUID转为数字取后边的12位,重复的可能性也好小
      

  8.   

    很简单啊,有什么不好用?
    System.Guid.NewGuid()
      

  9.   

    就是 System.Guid.NewGuid().ToString() 得到一串字符,然后按照 Samen168 朋友的说法
    "把GUID转为数字取后边的12位,重复的可能性也好小"  我就是想问问,怎么转!
      

  10.   

    就是 System.Guid.NewGuid().ToString() 得到一串字符,然后按照 Samen168 朋友的说法
    "把GUID转为数字取后边的12位,重复的可能性也好小"  我就是想问问,怎么转!
      

  11.   

    不是吧,luckljtchinaren(Lucky) ,你泡我啊!  "System.Guid.NewGuid().ToString()"生成的里面有字符串,用 System.Convert.ToInt32 那不肯定报错啊!
      

  12.   

    //生成随机数函数中从Vchar数组中随机抽取 
        //字母区分大小写 
        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; 
        } 

      

  13.   

    楼上的几位朋友,很感谢你们,不过!好象方法都没有达到我的要求,我现在就想知道如果配合GUID怎么得到12位号,如果说取GUID后面的12位,那么 Samen168 说的转换成数字到地怎么做:
    还有就是到底银行卡,游戏点卡或手机卡是如何生成的,就是不知道算法有个思路也行!谢谢!
      

  14.   

    System.Guid.NewGuid()很好,GUID肯定不重复
      

  15.   

    我知道用GUID好,但是我现在的问题是,我只能是12位的卡号,而且我还必须不能重复!GUID生成的不是12位!
      

  16.   

    string strFileId = Guid.NewGuid().ToString();
    笨呀,多退少补,不会对串操作呀.
      

  17.   


    lijianlee(素色人生) 你的想法我早就想过了,但是你就能保证你你手工截取的字符串,不重复!
    1万张可能不重,10万张,100万呢,按照你的方法,手工可不是很安全!
      

  18.   

    Guid为什么好? 因为它的可形成的不同编号足够多,可以"保证"唯一性,这是从几率上讲的,如果你生成的编号数目足够多,还是会重复的,但讨论这个没有意义,因为那个数目太大,没有多少实际意义.
    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交差了