【C#】利用子母和数字产生不重复随机码以及应用实例

 

  随机码的产生代码来自:关于C# 的高效随机字符串

  原文作者:ArLi2003的专栏

 

  产生随机码的代码如下

ExpandedBlockStart.gif 随机码产生
  ///   <summary>
    
///  随机密码
    
///   </summary>
     public   sealed   class  RandomStr
    {

        
public   const   string  myVersion  =   " 1.2 " ;

        
/* *******
        *  Const and Function
        *  *******
*/

        
private   static   readonly   int  defaultLength  =   8 ;

        
private   static   int  GetNewSeed()
        {
            
byte [] rndBytes  =   new   byte [ 4 ];
            RNGCryptoServiceProvider rng 
=   new  RNGCryptoServiceProvider();
            rng.GetBytes(rndBytes);
            
return  BitConverter.ToInt32(rndBytes,  0 );
        }

        
/* *******
         *  getRndCode of all char .
         *  *******
*/

        
private   static   string  BuildRndCodeAll( int  strLen)
        {
            System.Random RandomObj 
=   new  System.Random(GetNewSeed());
            
string  buildRndCodeReturn  =   null ;
            
for  ( int  i  =   0 ; i  <  strLen; i ++ )
            {
                buildRndCodeReturn 
+=  ( char )RandomObj.Next( 33 125 );
            }
            
return  buildRndCodeReturn;
        }

        
public   static   string  GetRndStrOfAll()
        {
            
return  BuildRndCodeAll(defaultLength);
        }

        
public   static   string  GetRndStrOfAll( int  LenOf)
        {
            
return  BuildRndCodeAll(LenOf);
        }

        
/* *******
         *  getRndCode of only .
         *  *******
*/

        
private   static   string  sCharLow  =   " abcdefghijklmnopqrstuvwxyz " ;
        
private   static   string  sCharUpp  =   " ABCDEFGHIJKLMNOPQRSTUVWXYZ " ;
        
private   static   string  sNumber  =   " 0123456789 " ;

        
private   static   string  BuildRndCodeOnly( string  StrOf,  int  strLen)
        {
            System.Random RandomObj 
=   new  System.Random(GetNewSeed());
            
string  buildRndCodeReturn  =   null ;
            
for  ( int  i  =   0 ; i  <  strLen; i ++ )
            {
                buildRndCodeReturn 
+=  StrOf.Substring(RandomObj.Next( 0 , StrOf.Length  -   1 ),  1 );
            }
            
return  buildRndCodeReturn;
        }

        
public   static   string  GetRndStrOnlyFor()
        {
            
return  BuildRndCodeOnly(sCharLow  +  sNumber, defaultLength);
        }

        
public   static   string  GetRndStrOnlyFor( int  LenOf)
        {
            
return  BuildRndCodeOnly(sCharLow  +  sNumber, LenOf);
        }

        
public   static   string  GetRndStrOnlyFor( bool  bUseUpper,  bool  bUseNumber)
        {
            
string  strTmp  =  sCharLow;
            
if  (bUseUpper) strTmp  +=  sCharUpp;
            
if  (bUseNumber) strTmp  +=  sNumber;

            
return  BuildRndCodeOnly(strTmp, defaultLength);
        }

        
public   static   string  GetRndStrOnlyFor( int  LenOf,  bool  bUseUpper,  bool  bUseNumber)
        {
            
string  strTmp  =  sCharLow;
            
if  (bUseUpper) strTmp  +=  sCharUpp;
            
if  (bUseNumber) strTmp  +=  sNumber;

            
return  BuildRndCodeOnly(strTmp, LenOf);
        }
    }

 

 

  验证示例如下,经过验证,产生速度较快,且重复率低,产生2000个随机码,没有重复,时间不超过1秒,机器为开发用标准配置。

  

ExpandedBlockStart.gif 验证代码
  class  Program
    {
        
static   void  Main( string [] args)
        {
            List
< string >  list  =   new  List < string > ();
            
int  num  =   0 ;
            
do
            {
                num
++ ;
                
// string str = code.CommunicationCode;
                 string  str  =  RandomStr.GetRndStrOnlyFor( 8 );
                
if  ( ! list.Contains(str))
                    list.Add(str);
                
else
                { }

            } 
while  (list.Count  <=  2000 );

            
for  ( int  i  =   0 ; i  <  2000 ; i ++ )
            {
                Console.WriteLine(list[i]);
            }
            Console.WriteLine(
" 总共生成 {0} 个数字 " , num);


            Console.WriteLine(
" --------------- " );
           
            Console.ReadLine();
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值