c++ - 二维索引的良好哈希函数

标签 c++ hash

我有一个名为 Point 的结构。要点很简单:

struct Point
{
    Row row;
    Column column;

    // some other code for addition and subtraction of points is there too
}

RowColumn 基本上是美化的 int,但我厌倦了不小心将输入参数转换为函数并给它们每个包装类。

现在我使用 set 点,但重复查找确实会减慢速度。我想切换到 unordered_set

所以,我想要一个 unordered_setPoint。通常,该集合可能包含例如 80x24 终端上的每个点 = 1920 个点。我需要一个好的散列函数。我刚刚想出了以下内容:

struct PointHash : public std::unary_function<Point, std::size_t>
{
    result_type operator()(const argument_type& val) const
    {
        return val.row.value() * 1000 + val.col.value();
    }
};

但是,我不确定这是否真的是一个很好的哈希函数。我想要一些快速的东西,因为我需要非常快速地进行许多查找。有没有更好的哈希函数我可以使用,或者这样可以吗?

最佳答案

Effective Java(第 2 版)中给出了该技术,并在 Scala 编程中引用了该技术。有一个素数常数(我们会说 53,但您可能会发现更大的值会在这里得到更均匀的分布),并按如下方式执行乘法和加法:

(53 + int_hash(row)) * 53 + int_hash(col)

对于更多的值(比如你添加一个 z 坐标),继续嵌套,就像

((53 + int_hash(row)) * 53 + int_hash(col)) * 53 + int_hash(z)

其中 int_hash 是一个用于散列单个整数的函数。您可以访问此页面查找a bunch of good hash functions对于单个整数。

关于c++ - 二维索引的良好哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2634690/

相关文章:

c++ - 什么时候应该使用统一初始化?

javascript - 如何计算 git 树哈希?

python - 散列 Python 类是个好主意吗?

java - Rabin 哈希函数 - Java 中的 FAST 实现

php - 散列密码加密?

c++ - 正确地将字符串添加到 Windows 注册表中的 REG_BINARY 类型

c++ - Media Foundation 获取编码比特率

c++ - 如何声明运算符/重载函数以对 const 变量和非常量变量进行操作?

c++ - 为什么没有宏来切割从 std::exception 派生的 bad_weak_ptr

C++ 在表达式中组合运算符重载