生成短随机Uniquer促销代码

时间:2014-02-23 19:59:16

标签: c# sql

在C#应用程序上,我需要创建UNIQUE促销代码。

促销代码将存储在SQL表(SQL Server 2012)中。

最初我虽然是GUIDS,但他们很想给用户。

我正在考虑使用6个字母数字代码,产生52 521 875个独特组合。

您怎么看?

但是如何生成代码以便它是独一无二的?我在考虑:

  1. 随机使用;

  2. 使用当前日期时间的刻度

  3. 预生成数据库中的所有代码并随机选择... 这种方法存在占用两个空间的问题。

  4. 生成随机唯一代码的好方法是什么?

    更新1

    对于1中的方法,我提出了以下C#代码:

      Random random = new Random();
    
      Int32 count = 20;
      Int32 length = 5;
    
      List<String> codes = new List<String>();
    
      Char[] keys = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
    
      while (codes.Count < count) {
    
        var code = Enumerable.Range(1, length)
          .Select(k => keys[random.Next(0, keys.Length - 1)])  // Generate random char
          .Aggregate("", (e, c) => e + c); // Join into a string              
    
        codes.Add(code);
    
      }
    

    更新2

      String source = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    
      while (codes.Count < count) {
    
        length = 5;
    
        StringBuilder builder = new StringBuilder(5);
    
        while (length-- > 0)
          builder.Append(source[random.Next(source.Length)]);
    
        codes.Add(builder.ToString());
    
      }
    

    您认为哪种方法更快?

    谢谢你, 米格尔

3 个答案:

答案 0 :(得分:5)

Eric Lippert展示了如何使用multiplicative inverse来混淆顺序密钥。基本上,我们的想法是生成顺序密钥(即1,2,3,4等),然后对它们进行模糊处理。

我在文章系列Obfuscating Sequential Keys中展示了一种更复杂的方法。

这种方法的优点在于键是随机的,但您需要跟踪的只是一个数字:下一个要生成的顺序值。

YouTube使用类似的技术生成视频ID。

答案 1 :(得分:2)

不要担心生成唯一代码。相反。 。 。

  • 生成随机代码。
  • 将该代码插入数据库。它属于具有唯一索引的列。
  • 捕获尝试插入重复值导致的错误。
  • 如果您获取重复值错误,请生成另一个随机代码,然后重试。

答案 2 :(得分:1)

我会选择第一名。 数字2不是随机的(你有下限和上限),数字3是一个过度杀伤。

也许你可以使用这样的东西:

DECLARE @VALUES varchar(100)
SET @VALUES = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'


SELECT SUBSTRING(@Values, CAST(FLOOR(RAND()*LEN(@Values)) + 1 AS int), 1) + 
       SUBSTRING(@Values, CAST(FLOOR(RAND()*LEN(@Values)) + 1 AS int), 1) + 
       SUBSTRING(@Values, CAST(FLOOR(RAND()*LEN(@Values)) + 1 AS int), 1) + 
       SUBSTRING(@Values, CAST(FLOOR(RAND()*LEN(@Values)) + 1 AS int), 1) + 
       SUBSTRING(@Values, CAST(FLOOR(RAND()*LEN(@Values)) + 1 AS int), 1) + 
       SUBSTRING(@Values, CAST(FLOOR(RAND()*LEN(@Values)) + 1 AS int), 1) 

使用表格存储以前生成的代码以检查uniqeness。