在C#应用程序上,我需要创建UNIQUE促销代码。
促销代码将存储在SQL表(SQL Server 2012)中。
最初我虽然是GUIDS,但他们很想给用户。
我正在考虑使用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
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());
}
您认为哪种方法更快?
谢谢你, 米格尔
答案 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。