Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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# 生成简短的随机Uniquer促销代码_C#_Sql - Fatal编程技术网

C# 生成简短的随机Uniquer促销代码

C# 生成简短的随机Uniquer促销代码,c#,sql,C#,Sql,在C应用程序上,我需要创建唯一的促销代码 促销代码将存储在SQL Server 2012的SQL表中 起初,我想使用guid,但它们太长了,无法提供给用户 我正在考虑一个6个字母数字的代码,产生52 521 875个独特的组合 你觉得怎么样 但是如何生成代码以使其唯一?我正在考虑: 随机使用 使用当前日期时间的刻度 预生成数据库中的所有代码并随机选取。。。 这种方法存在占用两个空间的问题 生成随机唯一代码的好方法是什么 更新1 对于1中的方法,我提出了以下C代码: Random random

在C应用程序上,我需要创建唯一的促销代码

促销代码将存储在SQL Server 2012的SQL表中

起初,我想使用guid,但它们太长了,无法提供给用户

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

你觉得怎么样

但是如何生成代码以使其唯一?我正在考虑:

随机使用

使用当前日期时间的刻度

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

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

更新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

你认为哪种方法更快

谢谢,, 米格尔

我选1号。 第二个不是随机的,你有下限和上限,第三个是过度杀伤力

也许你可以用这样的方法:

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) 

使用一个用于存储以前生成的代码的表来检查唯一性。

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

生成一个随机码。 将该代码插入数据库。它属于具有唯一索引的列。 陷阱由于尝试插入重复值而导致的错误。 如果出现重复值错误,请生成另一个随机代码,然后重试。
Eric Lippert演示了如何使用a混淆顺序键。基本上,其思想是生成顺序键,即1、2、3、4等,然后对它们进行模糊处理

在我的文章系列中,我展示了一种更复杂的方法

这种方法的美妙之处在于,关键点看起来是随机的,但您需要跟踪的只是一个数字:下一个要生成的连续值


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

您将生成多少代码?您可以只使用顺序代码吗?00000, 000001, ... , 00000Z,ZZZZZZ。我还不确定我将需要多少,但从一个项目到另一个项目,我只需要改变代码的长度。当然,通过使用大小写,我可以很容易地增加代码的数量。例如,谷歌地图使用大小写字母和数字以及长度为5的短链接。。。所以,对于序列代码来说,这就足够了,这是个坏主意。有时,您为同一实体提供40个代码。。。他们可以猜测并尝试下一个……但是如何生成代码使其唯一?所以你说它将产生独特的价值与兰德?这是我正在考虑。。。但是,比方说,对于400000个代码,我应该有更多的组合,所以你提到的不会经常发生。。。我甚至不需要尝试插入它。。。我可以试着找到它来检查它是否存在。。。或者,尝试插入它并从唯一索引中捕获错误会更快吗?从36个值中提取6个值,可以得到大约14亿个排列。使用大小写字母从62个字母中抽取6,可以得到大约440亿个排列。从62个数据池中取7可以得到大约2.5E12个排列。通常最好插入并捕获错误正确值,只需一次往返数据库。无论如何,您必须捕获错误。为什么这是一个问题?有几种不同的方法可以将批量数据获取到数据库中,但20不是批量数据。对于20个,我一次只插入一个。两万是一个不同的故事。真的很有趣。。。int的大小有限制吗?这可用于在SQL数据库中生成一个密钥,该数据库以PK为基础,PK为int,对吗?在URL中,正如您的示例所述,可能存在一个问题。。。有时只有小写字符是很好的。。。但这只是一个细节。是否可以使用您的代码,但使用不同的基?例如,只有小写字母的基数?@MDMoura:是的,这是可能的。我的模糊处理技术有两个部分:映射数字,然后编码。您可以使用您喜欢的任何字符组合进行编码。数字的大小没有真正的限制,尽管实际考虑可能会将您限制为64位。但是,如果您愿意,没有什么可以阻止您使用BigInteger。事实上,你可能想用Eric Lippert的博文中的乘法逆来进行映射,然后进行编码。你知道它的C实现吗?我在寻找长度相等的小写字符的模糊整数。。。我们的想法是不仅在促销代码生成中使用它,还可以混淆URL中包含的ID
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)