使用RNGCryptoServiceProvider 做种,可以在一秒内产生的随机数重复率非常的低,对于以往使用时间做种的方法是个升级,代码如下:
using System; using System.Security.Cryptography;
namespace ArLi.CommonPrj { /// <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); } } } 
|