c字符串比较与哈希比较

时间:2010-08-08 18:56:34

标签: c string hash compare

我需要将字符串与c中的多个其他常量字符串进行比较。我很好奇哪个更快,散列我要比较的字符串并将其与所有其他常量字符串哈希进行比较,或者只是将字符串作为字符串进行比较。提前谢谢你

谢谢你的答案,我要做很多比较。任何人都可以给我一个好的,快速的,低资源密集型的算法吗?我所知道的唯一哈希是MD5,我有一种过度杀戮的感觉。

我还想补充一点,字符串最多可能是20或30个字符,最多约为7个。

11 个答案:

答案 0 :(得分:8)

比较是进行一次还是多次?如果比较只进行一次,那么你最好做一个直接比较。如果你需要将很多字符串与这组常量字符串进行比较,那么从长远来看,你可以通过哈希来节省时间。

这是一个很简单的问题,您可以轻松地双向编写,并查看哪种方法更适合代表性的输入。

答案 1 :(得分:4)

如果您尝试将主题字符串与一组其他字符串匹配,则可以考虑使用Aho-Corasick String Matching Algorithm。它使用trie在一次传递中将主题与所有目标字符串进行匹配(实现起来也非常简单)。

答案 2 :(得分:4)

很难获得成功,字符串哈希函数是O(n)。字符串比较也是O(n),较小的哦。如果您可以存储计算的哈希值并重复使用它们,那么您才会领先。对于两者。

简单示例C哈希函数are here

答案 3 :(得分:3)

哈希值的平等并不能保证平等 - 不匹配会保证不平等。如果你需要将很多字符串与你的集合进行比较,那么哈希就会很棒 - 如果它是一次性的比较(不太可能我猜),那么strcmp会做得很好。

答案 4 :(得分:3)

我认为如果你有一个静态的字符串列表,我会将它们存储在一个有序数组中,然后使用bsearch来确定字符串是否在该列表中。如果它不存在,则返回NULL,或者如果存在,则返回指向该值的指针,并且可能比线性搜索或散列更快。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* cmp function for qsort and bsearch */
static int pstrcmp(const void *a, const void *b)
{
  return strcmp(*(char * const *)a, *(char * const *)b);
}

/* check an input against the list of known strings */
static char *check_for_match(char *input)
{
  static char *static_list[] = { "one", "two", "three", "four", "five" };
  static int nelems;

  /* this sorts the list, for demonstration purposes, but if the list
     is static then it could be sorted prior to compiling */
  if (! nelems)
  {
    nelems = sizeof(static_list) / sizeof(*static_list);
    qsort(static_list, nelems, sizeof(*static_list), pstrcmp);
  }


  return bsearch(&input, static_list, nelems, sizeof(*static_list), pstrcmp);
}

int main(int argc, char *argv[])
{
  if (check_for_match("should_not_match"))
  {
    printf("Match found.\n");
  } else {
    printf("No match found.\n");
  }

  if (check_for_match("two"))
  {
    printf("Match found.\n");
  } else {
    printf("No match found.\n");
  }
  return EXIT_SUCCESS;
}

答案 5 :(得分:1)

这取决于。什么是哈希算法?琴弦有多长?什么是平台?

另请注意,匹配的哈希不保证匹配字符串。

答案 6 :(得分:1)

如果在编译时知道常量字符串,请看一下“完美哈希”的概念。

维基百科:集合S的完美哈希函数是一个哈希函数,它将S中的不同元素映射到不同的整数,没有冲突。

“没有碰撞”的事情会让你失业。进一步阅读和实施的可能性是:

答案 7 :(得分:0)

这在很大程度上取决于字符串的长度和哈希函数的复杂性。自己实施和基准测试将是最好的答案......

答案 8 :(得分:0)

另一种可行的方法是将常量字符串排序并对字符串进行二分法搜索,这样您最多只进行log2(n)次比较(例如,对于1024个字符串甚至只进行10次比较,甚至只有20个1000000字符串)。 我不知道它是否适用于你的问题,但我用这种方法取得了很好的效果。哈希很难做到正确,角落案件可能变得非常讨厌,而密钥的计算通常会非常昂贵。

答案 9 :(得分:0)

  

谢谢你的答案   要做很多比较。能够   任何人都给我一个好的,快的,低的   资源密集型算法使用?   我所知道的唯一哈希就是MD5和我   有一种过度杀戮的感觉。

Murmur hash简单,快速且在统计测试中表现良好。

答案 10 :(得分:0)

直接回答您的问题,如果您只是比较两个字符串(您也可以考虑两个文件,两个视频等),逐个字符进行比较和哈希都为O(N),则没有明显的区别。这样做的优势。

但是,如果字符串可以更改,则哈希在第二次运行中会更有效,例如,滚动哈希https://en.wikipedia.org/wiki/Rolling_hash

此外,字符串/文件的散列就像指纹一样,如果下次另一个字符串与该字符串相同,则可以在下一次要比较时直接比较散列值