1

我正在寻找一种将字符串转换为唯一 ID 的方法。

受邀提出一种算法的想法,该算法为发送给它的每个字符串提供一个唯一编号。

我尝试使用哈希码,但后来意识到两个字符串可能具有相同的哈希码。

如何为每个字符串生成一个唯一代码作为输入,并且两个相同的字符串应该始终为我生成相同的 id。

4

4 回答 4

3

您的“唯一 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);
}

警告:如果字符串太大,这将中断

于 2013-03-15T16:08:40.083 回答
2

只需附加或预先添加一个 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 等)将是有益的。

为您指明正确的方向...

如果第二次传入字符串时返回的唯一字符串需要相同,则可以维护生成字符串的历史记录,并在每次请求生成时检查它。

说实话,有很多方法可以给这只猫剥皮……

于 2013-03-15T16:03:39.127 回答
1

如果原始字符串是敏感字符串,类似于Gravatar,您可以使用MD5 加密对字符串进行加密

正如您所说,@Austin Salonen评论说,它们不是 100% 独特的,但风险很低:

像 MD5 这样的哈希函数有何独特之处?

于 2013-03-15T16:27:20.010 回答
0

字符串可以很长,由字符组成,字符是 16 位值。可能的字符串数量很大(远远超过整数或 Guid 的范围)。所以你不能有一个函数“只是”将一个字符串翻译成一些有保证的唯一代码,没有一些帮助。

您可以使用数据库表:在表中查找您的字符串。如果它不存在,则插入它,生成一个新的(连续的)唯一 ID。如果它在那里,请使用该 ID。可能的字符串数量很大,您遇到的字符串数量可能不是。

于 2013-03-15T16:10:27.250 回答