我正在寻找一种将字符串转换为唯一 ID 的方法。
受邀提出一种算法的想法,该算法为发送给它的每个字符串提供一个唯一编号。
我尝试使用哈希码,但后来意识到两个字符串可能具有相同的哈希码。
如何为每个字符串生成一个唯一代码作为输入,并且两个相同的字符串应该始终为我生成相同的 id。
您的“唯一 ID”中可以包含字符吗?如果是这样,这应该工作;-)
public string MakeUnique(string s)
{
return s;
}
所有 ID 对于所提供的值都是唯一的。相同的字符串,将产生完全相同的 ID。这就是你想要的对吗?
如果它是您想要的整数结果,如何将每个字符转换为 int...
public int MakeUnique(string s)
{
string result = "";
foreach(var c in s)
{
result += ((int)c).ToString();
}
return Int.Parse(result);
}
警告:如果字符串太大,这将中断
只需附加或预先添加一个 guid:
string foo = "MyString";
//Simply throw it on the end
string uniqueString = foo + Guid.NewGuid();
//Prepend with underscore
string uniqueString = String.Format("{0}_{1}", foo, Guid.NewGuid());
//Append with underscore
string uniqueString = String.Format("{0}_{1}", Guid.NewGuid(), foo);
编辑(新要求)
您没有提供足够的信息让我对这个问题发表一个很好的答案。例如,环境(web、winforms 等)将是有益的。
为您指明正确的方向...
如果第二次传入字符串时返回的唯一字符串需要相同,则可以维护生成字符串的历史记录,并在每次请求生成时检查它。
说实话,有很多方法可以给这只猫剥皮……
如果原始字符串是敏感字符串,类似于Gravatar,您可以使用MD5 加密对字符串进行加密
正如您所说,@Austin Salonen评论说,它们不是 100% 独特的,但风险很低:
字符串可以很长,由字符组成,字符是 16 位值。可能的字符串数量很大(远远超过整数或 Guid 的范围)。所以你不能有一个函数“只是”将一个字符串翻译成一些有保证的唯一代码,没有一些帮助。
您可以使用数据库表:在表中查找您的字符串。如果它不存在,则插入它,生成一个新的(连续的)唯一 ID。如果它在那里,请使用该 ID。可能的字符串数量很大,您遇到的字符串数量可能不是。