【发布时间】:2015-06-27 18:22:04
【问题描述】:
这是我的随机字符串生成器的代码
private static string GetUniqueKey()
{
int maxSize = 15 ;
char[] chars = new char[62];
string a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
chars = a.ToCharArray();
int size = maxSize ;
byte[] data = new byte[1];
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
crypto.GetNonZeroBytes(data) ;
size = maxSize ;
data = new byte[size];
crypto.GetNonZeroBytes(data);
StringBuilder result = new StringBuilder(size) ;
foreach(byte b in data )
{
result.Append(chars[b % (chars.Length - 1)]);
}
return result.ToString();
}
如何编写一个单元测试来测试 100% 保证没有 2 个线程会生成相同的随机数
我不想锁定线程,因为它会在极端负载测试下造成性能噩梦。
此逻辑将用于负载平衡的 8 个应用服务器。
我不能使用 GUID,因为这个随机字符串应该像信用卡号一样可读。
在存储到数据库之前,我是否必须不断读取数据库以确保这是一个唯一编号?
【问题讨论】:
-
Guid.NewGuid 怎么样?
-
当使用没有单例的随机化器或控制随机化器的锁线程时,您不能:随机的定义是您从定义的(但非常大的)集合中获取随机值。您只能通过使您从中生成随机值的基集足够大来影响不获得相同随机值的机会。
-
即使是大集合,我如何确保这在 DB 中是唯一的?
-
您说“我不能使用 GUID,因为这个随机字符串应该像信用卡号一样可读”,因此您可以处理 GUID 上的校验和并提供其十六进制编码。或者,为什么不将服务器唯一 ID 与每个服务器设置的增量编号连接起来?
-
旁注:您要保证每 2 个随机数都是唯一的,这一事实保证这些是非随机数。
标签: c# asp.net multithreading random uniqueidentifier