生成随机字符串,因此没有两个线程发生冲突

时间:2015-06-27 18:22:05

标签: 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 ;
    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,因为这个随机字符串应该像信用卡号一样可读。

在存储数据库之前,是否必须不断读取数据库以确保这是一个唯一的数字?

3 个答案:

答案 0 :(得分:0)

  1. 它与线程的关系如何?
  2.   
        

    我只想确保该号码是唯一的,以便它不会存储在数据库中两次。

      
  3. 有不同的方法:

    一个。将所有密钥从db加载到列表中,然后查询列表 我不是很喜欢这种方式,但如果它是一个小列表,那么最好每次查询数据库。

    湾每次从DB读取,取决于数据库是否为本地数据。

    ℃。有一个内部机制,将根据DB中保存的最后一个生成新的唯一键。例如,如果最后保存的密钥是AAA,那么您知道下一个密钥是AAB。只是一个想法

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

    我正在上b或c。 也许有额外的解决方案,根据要求/需求,尝试看看哪种方式更适合你。

答案 1 :(得分:0)

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

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

  2. 当你有一个新的字符串不在集合中时,工作线程应该将它作为候选者添加到集合中。

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

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

  5. 中心线程应处理已确认的元素并将其从集合中删除。

  6. 最好在中心线程中缓存一些元素,以减少在重复值时需要处理数据库的可能性。

答案 2 :(得分:-1)

  

为什么它与线程有关?

我的意思是,如果您可以在2个不同的线程中获得相同的数字,您也可以在非并行场景中获得它。 获得相同的数字与线程无关。 顺便说一句,您可以使用Guid.NewGuid()来获取唯一的密钥。