【问题标题】:Generate unique 16 character strings across multiple runs在多次运行中生成唯一的 16 个字符串
【发布时间】:2013-06-10 06:30:00
【问题描述】:

我必须生成 16 个字符串,每月大约 1,00,000 个。它们应该不会在多次运行中重复(每月一次,每月一次)。实现这一目标的最佳方法是什么?使用哈希函数是个好主意吗? 字符串只能有 A-Z 和 0-9。 这将使用 C# 来完成。 编辑:字符串应该是随机的。因此,保留一个简单的计数器不是一种选择。

【问题讨论】:

  • 字符串中允许使用哪些字符?例如。如果允许的唯一字符是“1”和“0”,那么总共只有 65536 个可能的字符串。如果是任何 unicode 字符,则范围更大。
  • 你没有说任何关于要求的事情。它们应该是加密安全的吗?因为您可以简单地拥有一个计数器并输出“0000000000000001、0000000000000002”等...
  • 标签中应包含语言等内容

标签: c# hash unique


【解决方案1】:

由于您被限制为 16 个字母数字字符,GUID 可能不是一个选项 - 它要求完整的 128 位是唯一的,虽然这将生成一个 16 个字符的字符串,但它不一定符合字母数字约束。

您可以有一个简单的计数器并返回 MD5 哈希的最后 64 位,并每次检查唯一性。

//parse out hex digits in calling code
static long NextHash(HashSet<long> hashes, int count)
{
    System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
    long l = BitConverter.ToInt64(md5.ComputeHash(IntToArray(count)));
    if(!hashes.Contains(l)){
        hashes.Add(l);
        return l;
    } else return -1; //check this in calling code for failure
}
static byte[] IntToArray(int i)
{
    byte[] bytes = new byte[4];
    for(int j=0;j<4;j++){
    bytes[j] = (byte)i;
    i>>=8;    
    }
}

您可以为 GUIDS 做类似的事情,但我不知道当您只查看子字符串时发生冲突的可能性有多大。 MD5 哈希的优势在于“出现”更随机,如果这完全相关的话。

【讨论】:

    【解决方案2】:

    您没有指定语言。

    PHP,

    http://php.net/manual/en/function.uniqid.php

    echo rand(0,999).uniqid();
    rand(0,999) = 3 characters randomly
    uniqid() = 13 randomly characters 
    

    【讨论】:

      【解决方案3】:

      我不知道你是否满意,但我想出了那样的东西

      static List<string> generate(int count)
      {
          List<string> strings = new List<string>();
          while (strings.Count < count)
          {
              Guid g = Guid.NewGuid();                
              string GuidString = g.ToString();
              GuidString = GuidString.Replace("-", "");
              GuidString = GuidString.Remove(16);
              if (!strings.Contains(GuidString))
                  strings.Add(GuidString);
          }
          return strings;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-24
        • 1970-01-01
        • 2017-05-24
        • 2016-04-20
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        相关资源
        最近更新 更多