这是我的随机字符串生成器的代码
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 app服务器。
我不能使用GUID,因为这个随机字符串应该像信用卡号一样可读。
在存储数据库之前,是否必须不断读取数据库以确保这是一个唯一的数字?
答案 0 :(得分:0)
我只想确保该号码是唯一的,以便它不会存储在数据库中两次。
有不同的方法:
一个。将所有密钥从db加载到列表中,然后查询列表 我不是很喜欢这种方式,但如果它是一个小列表,那么最好每次查询数据库。
湾每次从DB读取,取决于数据库是否为本地数据。
℃。有一个内部机制,将根据DB中保存的最后一个生成新的唯一键。例如,如果最后保存的密钥是AAA,那么您知道下一个密钥是AAB。只是一个想法
d。将此唯一键定义为主键,如果您尝试添加相同的键,则会出现异常 - >尝试捕获可能有所帮助。 我不是很喜欢它,因为它也会影响性能。
我正在上b或c。 也许有额外的解决方案,根据要求/需求,尝试看看哪种方式更适合你。
答案 1 :(得分:0)
你有n个工作线程。您应该有一组共享字符串和一个中心线程来处理该集合。生命周期应如下所示:
工作线程生成一个字符串。如果它已经存在于队列中,则重复此步骤,直到获得新字符串。
当你有一个新的字符串不在集合中时,工作线程应该将它作为候选者添加到集合中。
您的中心线程应该检查候选人。如果给定的候选者在集合中重复,则将它们标记为重复。如果它们在集合中不重复,则根据数据库进行检查。如果它是重复的,则将其标记为重复。如果没有,则将其标记为成功。通知这些值后面的工作者线程。
通知的工作者线程应将该值标记为已确认,如果该值是重复的,则跳转到步骤1.
中心线程应处理已确认的元素并将其从集合中删除。
最好在中心线程中缓存一些元素,以减少在重复值时需要处理数据库的可能性。
答案 2 :(得分:-1)
为什么它与线程有关?
我的意思是,如果您可以在2个不同的线程中获得相同的数字,您也可以在非并行场景中获得它。 获得相同的数字与线程无关。 顺便说一句,您可以使用Guid.NewGuid()来获取唯一的密钥。