1

我想生成一个 9 位唯一的随机字符串。目前我正在使用

Guid.NewGuid().ToString().Replace("-","").Substring(0,9)

但恐怕它很快就会发生碰撞。有没有更好的方法或者这样可以吗?

4

3 回答 3

4

如果您采用 GUID 的子字符串,则根本无法保证随机性唯一性

请参阅我对较旧的 SO 问题的回答以满足您的随机性要求。这是执行此操作的基本代码。

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);
}

它为您提供 12 位计数以防止冲突以及您想要的任何其他随机数字。您可以根据需要修改代码,使其短于 12 位字符串。

于 2012-08-16T06:53:07.827 回答
1

好吧,使用 GUID,它可以保证是全球唯一的,但只是作为一个整体。您不能假设整个 GUID 的子字符串具有随机性。

此外,如果您是从同一来源生成的,那么子字符串中就会出现冲突,因为该算法使用了一些相同的变量,例如计算机的 MAC 地址,尽管我对此并不完全确定。不过作为一个例子就足够了。

因此,如果您想从 GUID 的子字符串创建随机字符串,您必须跟踪所有以前的 GUID 以确保没有冲突。你会得到一个拉斯维加斯算法。

于 2012-08-16T07:02:50.597 回答
0

我决定回答我自己的问题,因为这是我找到的最简单的答案。归功于返回相同字符串的随机字符串生成器

    private static Random random = new Random((int)DateTime.Now.Ticks);
    private static object locker = new object();

    private static string RandomString(int size)
    {
        StringBuilder builder = new StringBuilder();
        char ch;
        for (int i = 0; i < size; i++)
        {
            lock (locker)
            {
                ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
            }
            builder.Append(ch);
        }

        return builder.ToString();
    }
于 2012-08-16T08:07:50.323 回答