【发布时间】:2017-10-31 08:21:02
【问题描述】:
我有一个实用程序函数,我想将它作为我的 URL 查询字符串的一部分。我需要确保它始终是独一无二的
public static string RandomString(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz0123456789";
var random = new Random();
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
}
如果说我传入 14 作为长度,这会生成类似哈希
YS5bwVTjwEBhFp
sNi6EfU5rUxI2Z
sQKhqhklw22vb2
如果我说它一年使用 20,000 次,是否可以肯定地说它应该始终是独一无二的?
再次
【问题讨论】:
-
当然,假设是不安全的。
Random不存储去年所有先前调用的结果,通过反射识别调用方法,然后说,“哦,又是米勒,生成哈希。确保他得到一些新的!” -
Random不承诺唯一性。 -
对于全球唯一 ID,请使用... GUID。
-
使用转换为字符串的 Guid,它不会是唯一的,但碰撞的机会很小,被认为是唯一的。
-
事实上,非常严重的是,如果
Random在一段时间内没有重复序列,它就会随机性降低。如果您今天看到“4,0,1,0,4,0,1,0”,您可以确定明天不会看到它。