【问题标题】:String to number generator字符串到数字生成器
【发布时间】:2013-03-04 10:26:16
【问题描述】:

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

为发送给它的每个字符串提供一个唯一编号的算法邀请的想法。

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

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

【问题讨论】:

  • 我每次都需要相同的字符串来生成相同的 id。我认为 guid 不适合这里。
  • @GutterStink - 你已经回答了你自己的问题。要么,要么你在要求一些不可能的事情。哈希将始终为两个相同的字符串生成相同的代码。如果您希望两个字符串“以不同方式”发送以生成唯一 ID,但还让它们每次都继续生成相同的 ID,如果没有额外的元数据,这是不可能的。
  • 从一个新问题开始,满足您的所有要求(例如,唯一 ID 的大小 - 它是整数还是字符串等)
  • 两个字符串有 1:2^32 的机会拥有相同的哈希码(假设 string.GetHashCode 是“好”)。你确定你不能忍受吗?
  • 你想用数字重新创建一个字符串吗?如果是,那么也许看看一些数据压缩算法(例如en.wikipedia.org/wiki/LZ77_and_LZ78_(algorithms))?

标签: c# hash


【解决方案1】:

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

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

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

说实话,给这只猫剥皮的方法有很多......

【讨论】:

  • 我需要确保下次传递相同字符串时生成相同的 guid...
  • @GutterStink,这个要求肯定会改变一些事情,但这仍然是一种可行的方法。请记住,在发布问题之前认真考虑您的要求非常重要,这样您就不需要那些回答的人回溯。
  • 对此我深表歉意。下次我会记住这一点。
【解决方案2】:

您的“唯一 ID”中可以包含字符吗?如果是这样,这应该工作;-)

public string MakeUnique(string s)
{
    return s;
}

所有 ID 对于所提供的值都是唯一的。相同的字符串,将产生完全相同的 ID。这就是你想要的对吧?


如果是你想要的整数结果,如何将每个字符转换为整数...

public int MakeUnique(string s)
{
    string result = "";

    foreach(var c in s)
    {
        result += ((int)c).ToString();
    }

    return Int.Parse(result);
}

警告:如果字符串为too big,则会中断

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      How are hash functions like MD5 unique?

      【讨论】:

      • @ReacherGilt:是的,它是“单向加密”。我会发布一个详细说明这一点的链接,但你的已经完成了这项工作。在使用它们来尝试证明某人错之前,您应该尝试阅读自己的链接。我知道这通常不是您所说的加密,但仍然
      • @ReacherGilt 您刚刚引用了“MD5 不像您想象的那样加密”和“而 MD5 是一种单向加密形式”。这是对 MD5 作为一种加密形式的两次引用。
      • @ReacherGilt:坚持你的链接......“加密是用算法转换信息。” (这就是 MD5 所做的)。为了巩固这一点,使用 MD5 算法加密的数据也可以被解密——虽然我强调这样做不切实际,但这是可能的
      • @ReacherGilt 这变得无关紧要。 OP 从未要求将输出结果转换回原始字符串的能力。进一步:In a technical, computer science sense you are both absolutely correct.。这是 StackOverflow,我们在技术/计算机科学的背景下讨论。
      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多