根据您的update2,即使msdn引用了Guid,也可以断定它是正确的。这是一种使用具有加密功能的随机数生成器来创建ID的方法。
static long counter; //store and load the counter from persistent storage every time the program loads or closes.public static string CreateRandomString(int length){ long count = System.Threading.Interlocked.Increment(ref counter); int PasswordLength = length; String _allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789"; Byte[] randomBytes = new Byte[PasswordLength]; RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); rng.GetBytes(randomBytes); char[] chars = new char[PasswordLength]; int allowedCharCount = _allowedChars.Length; for (int i = 0; i < PasswordLength; i++) { while(randomBytes[i] > byte.MaxValue - (byte.MaxValue % allowedCharCount)) { byte[] tmp = new byte[1]; rng.GetBytes(tmp); randomBytes[i] = tmp[0]; } chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount]; } byte[] buf = new byte[8]; buf[0] = (byte) count; buf[1] = (byte) (count >> 8); buf[2] = (byte) (count >> 16); buf[3] = (byte) (count >> 24); buf[4] = (byte) (count >> 32); buf[5] = (byte) (count >> 40); buf[6] = (byte) (count >> 48); buf[7] = (byte) (count >> 56); return Convert.Tobase64String(buf) + new string(chars);}
编辑我知道有一些偏差,因为allowedCharCount
不能被255整除,如果该偏差落在其余部分的无芒数中,您可以摆脱偏差并获得一个新的随机数。
EDIT2-这不能保证唯一,您可以持有一个静态的64位(或更高,如果需要)单调计数器,将其编码为base46,并将其作为id的前4-5个字符。
更新-现在保证是唯一的
更新2:算法现在速度较慢,但消除了偏差。
编辑:我刚刚运行了一个测试,我想让您知道Tobase64String可以返回非字母数字字符(例如1编码为
"AQAAAAAAAAA="),以便您知道。
新版本:
从本页上的MattDotson的答案中得出的结论,如果您不太担心键空间,可以采用这种方式进行 *** 作,这样可以更快地运行很多。
public static string CreateRandomString(int length){ length -= 12; //12 digits are the counter if (length <= 0) throw new ArgumentOutOfRangeException("length"); long count = System.Threading.Interlocked.Increment(ref counter); Byte[] randomBytes = new Byte[length * 3 / 4]; RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); rng.GetBytes(randomBytes); byte[] buf = new byte[8]; buf[0] = (byte)count; buf[1] = (byte)(count >> 8); buf[2] = (byte)(count >> 16); buf[3] = (byte)(count >> 24); buf[4] = (byte)(count >> 32); buf[5] = (byte)(count >> 40); buf[6] = (byte)(count >> 48); buf[7] = (byte)(count >> 56); return Convert.Tobase64String(buf) + Convert.Tobase64String(randomBytes);}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)