Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成随机字符串,这样就不会有两个线程发生冲突_C#_Asp.net_Multithreading_Random_Uniqueidentifier - Fatal编程技术网

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()获取唯一密钥

  • 它与线程的关系如何

  • 我只是想确保这个数字是唯一的,这样它就不会在数据库中存储两次

  • 有不同的方法可以做到这一点:

    a。将数据库中的所有键加载到列表中,然后查询列表 我真的不喜欢这种方式,但如果它是一个小列表,最好每次都查询数据库

    b。每次从数据库中读取数据,这取决于数据库是否为本地数据库

    c。具有一个内部机制,根据数据库中保存的最后一个密钥生成新的唯一密钥。例如,如果上次保存的密钥是AAA,那么您知道下一个密钥将是AAAB。只是个主意

    d。将此唯一键定义为主键,如果尝试添加相同的键,将出现异常-->使用try-catch可能会有所帮助。 我真的不喜欢它,因为它也会影响性能

    我在上b或c。
    可能还有其他的解决方案,请根据要求/需要尝试看看哪些更适合您。

    您有n个工作线程。您应该有一组共享的字符串和一个中心线程来处理该组字符串。生命周期应如下所示:

  • 工作线程生成一个字符串。如果队列中已经存在该字符串,则重复此步骤,直到获得新字符串

  • 当您有一个新字符串而该字符串不在集合中时,工作线程应该将其作为候选字符串添加到集合中

  • 你的中心线应该检查候选者。如果给定的候选项在集合中重复,则将其标记为重复项。如果它们在集合中不重复,则根据数据库检查它们。如果是重复的,则将其标记为重复。如果没有,则将其标记为成功。通知这些值后面的工作线程

  • 通知的工作线程应将该值标记为已确认,如果该值重复,则跳到步骤1

  • 中心线程应处理已确认的元素,并将其从集合中移除


  • 在中心线程中缓存一些元素是一个好主意,以减少在值重复的情况下需要处理数据库的可能性。

    Guid.NewGuid如何?当使用没有单例或锁线程控制随机化器的随机化器时,您不能:random的定义是这样的,您可以得到一个随机值定义的(无论多么大)集合中的值。您只能通过使生成随机值的基集足够大来影响未获得相同随机值的机会。即使使用大的基集,我如何确保这在DB中是唯一的?您说过“我不能使用GUID,因为此随机字符串应该像信用卡号一样可以被人读取”,因此,您可以在GUID上处理校验和并提供其十六进制编码。或者,为什么不将服务器唯一ID与每个服务器设置的增量数字连接起来?旁注:您希望保证每2个随机数都是唯一的,这一事实保证了这些不是随机数。此随机字符串应该是人类可读的,因此我不能使用GUIDI。我只想确保该数字是唯一的,以便未在数据库中存储两次。