我想生成一个9位唯一的随机字符串。目前我正在使用
Guid.NewGuid().ToString().Replace("-","").Substring(0,9)
但恐怕很快就会发生碰撞。有没有更好的方法,或者这可以吗?
答案 0 :(得分:4)
如果你带一个GUID you are not guaranteed randomness uniqueness at all的子字符串。
请参阅my answer to a older SO question以满足您的随机性要求。这是执行此操作的基本代码。
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位数字符串。
答案 1 :(得分:1)
嗯,使用GUID,它保证全局唯一,但仅作为一个整体。您不能假设有关整个GUID的子字符串的随机性。
此外,如果你是从同一个源生成的,那么子串会发生冲突,因为算法使用了一些相同的变量,例如计算机的MAC地址,尽管我并不完全确定那个。它就足以作为一个例子了。
因此,如果要从GUID的子字符串创建随机字符串,则必须跟踪所有先前的GUID以确保没有冲突。你会得到一个拉斯维加斯算法。
答案 2 :(得分:0)
我决定回答我自己的问题,因为这是我找到的最简单的答案。致Random String Generator Returning Same String
的积分 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();
}