Qt4 QHash哈希冲突?

mzz*_*hmh 4 qt qhash

我使用的是QT 4.8,我注意到它有一个QHash可以按如下方式使用的类:

  QHash<QString, int> hash;
  hash["one"] = 1;
  hash["three"] = 3;
  hash["seven"] = 7;
  hash.insert("twelve", 12);
Run Code Online (Sandbox Code Playgroud)

如果存在哈希冲突,是否会正确处理?

Arn*_*nce 14

是的,将处理冲突.QHash是基于经典散列表的容器的标准实现,如果它没有正确处理冲突,则不会非常可靠.通常,基于散列表的容器将键不映射到列表中的单个条目,而是映射到"桶",其可以包含多个条目,其中不同的键映射到相同的散列值.

获取值时,密钥的哈希值将导致正确的存储桶,然后容器将遍历存储桶中的条目,直到找到您要查找的特定密钥的匹配项.

虽然我在文档中找不到Qt实现的"正确性"的具体参考,但这个引用得以说明.我无法想象不然.

QHash的内部哈希表以2的幂增长,并且每次增长时,项目都被重新定位在新的桶中,计算为qHash(key)%QHash :: capacity()(桶的数量).

一个简单的测试将增加我们的信心:

BadHashOjbect.h

#ifndef BADHASHOBJECT_H
#define BADHASHOBJECT_H

class BadHashObject
{
public:
    BadHashObject(const int value): value(value){}

    int getValue() const
    {
        return value;
    }

private:
    int value;
};

bool operator==(const BadHashObject &b1, const BadHashObject &b2)
{
    return b1.getValue() == b2.getValue();
}

uint qHash(const BadHashObject &/*key*/)
{
    return 1;
}

#endif // BADHASHOBJECT_H
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include <iostream>
#include <QHash>
#include "BadHashObject.h"

using namespace std;

int main(int , char **)
{
    cout << "Hash of BadHashObject(10) is: " << qHash(BadHashObject(10)) << endl;
    cout << "Hash of BadHashObject(100) is: " << qHash(BadHashObject(100)) << endl;
    cout << "Adding BadHashObject(10), value10 and BadHashObject(100), value100" << endl;
    QHash<BadHashObject, QString> hashMap;
    hashMap.insert(BadHashObject(10), QString("value10"));
    hashMap.insert(BadHashObject(100), QString("value100"));
    cout << "Size of hashMap: " << hashMap.size() << endl;
    cout << "Value stored with key 10: " << hashMap.value(BadHashObject(10)).toStdString() << endl;
    cout << "Value stored with key 100: " << hashMap.value(BadHashObject(100)).toStdString() << endl;
}
Run Code Online (Sandbox Code Playgroud)

BadHashObject级的存储int和它的哈希函数总是返回1所以所有对象添加到一个QHash使用这种类型的键会导致碰撞.我们的测试程序的输出显示正确处理了碰撞.

Hash of BadHashObject(10) is: 1
Hash of BadHashObject(100) is: 1
Adding BadHashObject(10), value10 and BadHashObject(100), value100
Size of hashMap: 2
Value stored with key 10: value10
Value stored with key 100: value100
Run Code Online (Sandbox Code Playgroud)