使用GUID是一种生成随机字符串和数字的有效方法吗?

可能重复:
随机是System.Guid.NewGuid()?

基于这个问题,我想知道是否使用GUID生成随机字符串和数字有任何缺陷吗?

因此,例如,如果我想要一个随机字符串和32个或更少字符的数字,我可以使用以下C#代码:

string s = Guid.NewGuid().ToString().Replace("-", ""); 

如果长度需要小于32,我将截断字符串,如果需要更长,我会将多个GUID一起添加。

这种方法有哪些缺陷?

在我写完之后,我意识到一个缺陷就是它只会有字母a到f所以我会修改这个问题:

这是一个真正随机的6个字符和10个数字的序列吗?

GUID不保证随机性,它保证了唯一性。 如果您想要随机性,请使用Random生成字符串。

它实际上并不是随机的,而是(相对)唯一的。 如果你真的想要随机性,我建议使用类似System.Random中值的哈希值。

这是 .NET“System.Random”的MSDN文档的链接,以及它们的Hashing包的相同内容。

正如其他答案所解释的那样, GUID只保证唯一性,而不是随机性。

如果您需要的是唯一性,那么您问题中的代码就可以了,尽管您可以使用Guid.NewGuid().ToString("N")而不是显式替换连字符。

如果你确实需要一个随机字符串,那么尝试这样的事情:

 // use RNGCryptoServiceProvider instead of Random if you need extra security private readonly Random _rng = new Random(); public string GetRandomString(int length) { const string allowedChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; char[] buffer = new char[length]; for (int i = 0; i < length; i++) { buffer[i] = allowedChars[_rng.Next(allowedChars.Length)]; } return new string(buffer); } 

不可以。例如,标准的GUID生成算法包括当前时间和进行生成的计算机的MAC地址。

如前所述,GUID被设计为独特的,而不是随机的。 生成“随机”字符串 (即满足随机性的某些统计要求)的更好且相当简单的方法是使用Random

 ///  /// Generates a random string with the given length ///  /// Size of the string /// If true, generate lowercase string /// Random string private string RandomString(int size, bool lowerCase) { StringBuilder builder = new StringBuilder(); Random random = new Random(); char ch; for (int i = 0; i < size; i++) { ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); builder.Append(ch); } if (lowerCase) return builder.ToString().ToLower(); return builder.ToString(); } 

如果您需要“更安全”的随机数,您可能需要查看RNGCryptoServiceProvider 。 但正如约翰冯·诺伊曼所说 :

任何考虑产生随机数字的算术方法的人当然都处于罪恶状态。

如前所述,GUID旨在生成唯一,然后保持几乎静态。 由于所有随机生成都只是伪随机的(你会在生成几千个整数值后开始看到模式),所以只使用标准的Random()类是理想的。 每次构造一个新对象时,它都将使用当前系统时间对其进行播种。 这将保证它最接近随机。 你永远不应该使用静态的东西来种子随机方法。

由于Guid独特的原因,解决方案是可以的。