C# 生成随机字符串,这样就不会有两个线程发生冲突
这是我的随机字符串生成器的代码C# 生成随机字符串,这样就不会有两个线程发生冲突,c#,asp.net,multithreading,random,uniqueidentifier,C#,Asp.net,Multithreading,Random,Uniqueidentifier,这是我的随机字符串生成器的代码 private static string GetUniqueKey() { int maxSize = 15 ; char[] chars = new char[62]; string a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; chars = a.ToCharArray(); int size = maxSize ;
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%保证没有两个线程会生成相同的随机数
我不想锁定线程,因为它在极端负载测试下会产生性能问题
此逻辑将用于负载平衡的8个应用程序服务器
我不能使用GUID,因为这个随机字符串应该像信用卡号一样可读 在存储到数据库之前,我是否必须不断地读取数据库以确保这是唯一的数字 为什么它与线程有关 我的意思是,如果你可能在两个不同的线程中得到相同的数字,那么在非并行场景中也可能得到相同的数字。 获取相同的编号与线程无关。 顺便说一句,您可以使用Guid.NewGuid()获取唯一密钥
我只是想确保这个数字是唯一的,这样它就不会在数据库中存储两次
可能还有其他的解决方案,请根据要求/需要尝试看看哪些更适合您。您有n个工作线程。您应该有一组共享的字符串和一个中心线程来处理该组字符串。生命周期应如下所示:
在中心线程中缓存一些元素是一个好主意,以减少在值重复的情况下需要处理数据库的可能性。Guid.NewGuid如何?当使用没有单例或锁线程控制随机化器的随机化器时,您不能:random的定义是这样的,您可以得到一个随机值定义的(无论多么大)集合中的值。您只能通过使生成随机值的基集足够大来影响未获得相同随机值的机会。即使使用大的基集,我如何确保这在DB中是唯一的?您说过“我不能使用GUID,因为此随机字符串应该像信用卡号一样可以被人读取”,因此,您可以在GUID上处理校验和并提供其十六进制编码。或者,为什么不将服务器唯一ID与每个服务器设置的增量数字连接起来?旁注:您希望保证每2个随机数都是唯一的,这一事实保证了这些不是随机数。此随机字符串应该是人类可读的,因此我不能使用GUIDI。我只想确保该数字是唯一的,以便未在数据库中存储两次。