【问题标题】:Unique Value for Two Strings两个字符串的唯一值
【发布时间】:2011-06-22 02:03:41
【问题描述】:

这似乎是一个相当简单的问题,但解决方案却让我望而却步:

如果我有以下两个字符串:

string str1 = "Ping";
string str2 = "Pong";

我需要一种算法来为这两个字符串创建一个唯一值,无论它们的顺序如何。例如:

UniqueValue(str1, str2) 和 UniqueValue(str2, str1) 应该返回完全相同的值。

编辑:UniqueValue 返回一个字符串。我知道它不会是“真正”唯一的,但类似哈希的值会起作用。

谢谢, 泰勒

【问题讨论】:

  • 能不能具体说说 UniqueValue 的返回类型?
  • 这些字符串的 UniqueValue 输出是什么?
  • 独一无二有多独特?任何其他组合都无法复制? Ping 和 Pong 直到时间结束才会产生相同的唯一值?结果类型是什么?你遗漏了很多东西。
  • 查看贾斯汀的回答。它可以是真正独一无二的,如果你有 O(N) 存储空间,你就不必满足于散列。

标签: c#


【解决方案1】:

对字符串进行排序。

将每个字符串中的/ 转换为//; 转换为/;

连接字符串,在每个字符串之间放置一个;

【讨论】:

  • 这保证了创建的值是唯一的,并且“ab”“cdef”和“abc”“def”的组合产生不同的结果,即使它们包含分隔符(即@987654326 @)。缺点是它与字符串本身一样长,但如果您希望哈希是一对一的,这是必要的。
  • 太棒了!打我一拳。
【解决方案2】:

您可以对哈希码进行异或运算。

static string UniqueValue (string str1, string str2)
{
   return (str1.GetHashCode () ^ str2.GetHashCode()).ToString ();
}

编辑:或者,您可以生成此字符串:

if (str2 > str1)
   return str1+str2;
return str2+str1;

【讨论】:

  • 或者,您可以连接字符串并对其进行排序。
  • 我认为 xoring 更好。排序会引入不必要的开销。
  • 您的编辑对“ab”+“cdef”和“abc”+“def”产生相同的结果。您需要一个唯一的分隔符,并在组合字符串中可能存在的地方转义该分隔符。
  • 据我了解,给定输入的结果必须相同,而不是在整个域中唯一。
【解决方案3】:

我会使用某种散列,但我没有看到任何算法可以产生 100% 保证唯一的字符串,并且永远不会被任何其他两个字符串复制。

【讨论】:

    【解决方案4】:

    我会用 SHA1 对它们进行哈希处理:http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1.aspx

    要确定它们在连接时应该处于哪个方向,请使用String.CompareTohttp://msdn.microsoft.com/en-us/library/system.string.compareto.aspx

    【讨论】:

      【解决方案5】:
      public int UniqueValue(params string[] strings)
      {
          return String.Join("~", strings.AsEnumerable<string>()
                                         .OrderBy<string, string>(s => s)
                                         .ToArray<string>())
                       .GetHashCode();
      }
      

      当然,前提是您不需要完整唯一性并且哈希码就足够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-31
        • 1970-01-01
        • 2011-09-17
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        相关资源
        最近更新 更多