如何生成长引导?

如何生成长引导?,第1张

如何生成长引导?

根据您的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);}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5674171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存