【问题标题】:Comparing strings multiple times多次比较字符串
【发布时间】:2013-02-19 18:04:12
【问题描述】:

我正在生成随机脚本,但我必须保证每个新脚本都是唯一的(以前没有重复过)。所以基本上每个已经生成的脚本都会与每个新脚本进行比较。

我认为必须有一种方法来散列每个新脚本,而不是仅仅使用普通的字符串比较,这样比较会更快。

关于如何对字符串进行哈希处理以加快多重比较的任何想法?

【问题讨论】:

  • 您需要确保所有字符串都相同?
  • “每一个新的都是独一无二的”所以与你所说的相反:)
  • 您是否尝试过 HashSet 或 Dictionary 使用脚本摘要进行查找(O(1) 查找速度)?

标签: c# string algorithm hash compare


【解决方案1】:

一种方法是使用HashSet<String>

HashSet 类提供高性能的集合操作。一组是 一个不包含重复元素的集合,其元素 没有特别的顺序。

HashSet<string> scripts = new HashSet<string>();

string generated_script = "some_text";

if (!scripts.Contains(generated_script)) // is HashSet<String> dont contains your string already then you can add it
{
    scripts.Add(generated_script);
}

另外,您可以检查数组中是否存在duplicate items。 但这与HashSet&lt;String&gt;相比可能效率不高

string[] array = new[] {"demo", "demo", "demo"};
string compareWith = "demo";

int duplicates_count = array.GroupBy(x => x).Count(g => g.Count() > 1);

【讨论】:

  • OP 似乎在寻找文件散列..而不是字符串比较。
  • 我相信这会很慢。 @Simon 不知道你为什么认为我在寻找文件散列。
  • @Spacemonkey - 使用HashSet&lt;String&gt; 是个人用来查找文件大小为 500 MB 的 txt 文件中的重复项,只需几秒钟!
  • 好的,谢谢你的回答,我会基准测试看看,我确定它比普通字符串比较快
  • @Spacemonkey 你说的是“脚本”。我假设你的意思是一个文件..不是一个字符串。
【解决方案2】:

像下面这样使用 HashSet

        string uniqueCode= "ABC";
        string uniqueCode1 = "XYZ";
        string uniqueCode2 = "ABC";
        HashSet<string> uniqueList = new HashSet<string>();

       uniqueList.Add(uniqueCode);
       uniqueList.Add(uniqueCode1);
       uniqueList.Add(uniqueCode2);

如果您看到 uniqueListCount,您将是 2。所以 ABC 不会出现两次。

【讨论】:

    【解决方案3】:

    您可以使用 HashSet。保证哈希集永远不会包含重复项

    【讨论】:

      【解决方案4】:

      将脚本与其哈希一起存储:

      class ScriptData
      {
        public ScriptData(string script)
        {
          this.ScriptHash=script.GetHashCode();
          this.Script=script;
        }
      
        public int ScriptHash{get;private set;}
        public string Script{get;private set;}
      }
      

      然后,当您需要检查新的随机脚本是否唯一时,只需获取新脚本的哈希码并搜索您的所有 ScriptData 实例以查找具有相同哈希码的任何实例。如果你没有找到任何你知道你的新随机脚本是独一无二的。如果您确实找到了一些,那么它们可能是相同的,您必须比较脚本的实际文本以查看它们是否相同。

      【讨论】:

      • 您是在暗示GetHashCode 方法可能是瓶颈吗?
      • 不一定,但是如果您要继续重新计算它,那么您不妨将其存储在某个地方。
      【解决方案5】:

      您可以将每个生成的string 存储在HashSet 中。

      对于每个新字符串,您将调用 Contains 方法,该方法以 O(1) 复杂度运行。这是确定新生成的字符串是否之前生成的简单方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        相关资源
        最近更新 更多