我必须生成16个字符串,每月大约1,00,000个字符串。它们应该是这样的,它们不会在多次运行中重复(每月一次,每月一次)。实现这一目标的最佳方法是什么?使用哈希函数是个好主意吗? 该字符串只能有A-Z和0-9。 这是使用C#完成的。 编辑:字符串应该是随机的。因此,保留一个简单的计数器不是一种选择。
答案 0 :(得分:1)
由于您只限制了16个字母数字字符,因此GUID可能不是一个选项 - 它要求完整的128位是唯一的,而这将生成一个16个字符的字符串,它不一定符合字母数字约束。 / p>
你可以有一个简单的计数器并返回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哈希具有“出现”更随机的优势,如果这完全相关的话。
答案 1 :(得分:0)
您尚未指定语言。
PHP,
http://php.net/manual/en/function.uniqid.php
echo rand(0,999).uniqid();
rand(0,999) = 3 characters randomly
uniqid() = 13 randomly characters
答案 2 :(得分:0)
我不知道这是否让你满意,但我想出了那样的
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;
}