字符串的独特属性,用于构建高效的哈希表

时间:2015-11-26 15:45:22

标签: c++ string hash hash-function

C ++中字符串的唯一属性是什么?为什么它们可以通过关系运算符进行比较(例如,当尝试按字母顺序对字符串数组进行排序时)?我正在努力利用这个"属性"为了为每个可能的字符串没有冲突的表构建一个精细的散列函数。此外,什么数据结构可以用于此?我正在考虑一个向量,因为我必须在不知道其中有多少独特单词的情况下浏览文档,而且我只想阅读一次该文档。

3 个答案:

答案 0 :(得分:0)

C ++标准字符串本质上是字符的向量。因此,比较字符串意味着从一开始就逐字符地比较它们。 我不确定你的'独特属性'是什么意思,但对于你的用例,任何散列算法都应该这样做。 如果我正确理解你的用例,你可能想要使用std :: set< YourHashType>或者std :: map。这样你就不必去处理是否已经添加了一个单词。

答案 1 :(得分:0)

计算以null结尾的C样式字符串的哈希键的最简单算法如下:

UINT HashKey(const char* key) const
{
    UINT nHash = 0;
    while (*key)
        nHash = (nHash<<5) + nHash + *key++;
    return nHash;
}

答案 2 :(得分:0)

  

我正在尝试利用这个“属性”来为一个表构建一个精细的散列函数,而不会对每个可能的字符串发生冲突。

作为pigeonhole principle的示例,您不能拥有无冲突哈希函数。当你使用像std::strcmp这样的函数词法(例如逐个字母)比较它们时,字符串排序是唯一的,但这只会使用比较而不是字符串的固有唯一属性来为您提供唯一的排序。

如果你有一组有限的键,你可以设计一个无冲突的哈希函数,这被称为perfect hashing