如何实现具有两个或更多键的哈希函数?

Posted

技术标签:

【中文标题】如何实现具有两个或更多键的哈希函数?【英文标题】:How do I implement a hash function with two keys or more? 【发布时间】:2021-01-05 16:17:20 【问题描述】:

我目前正在研究 C++ 中的数据结构和算法学期项目。我想实现一个哈希函数来使用他的名字(字符串)和他的电话号码(整数)访问一个人的数据。我还计划使用开放寻址处理冲突(如果此信息相关)。另外,我不允许使用任何 STL 库函数。

【问题讨论】:

boost有个方便的功能hash_combine,即使不能直接使用也可以随时捏源码。 你应该首先为一个字符串实现一个散列函数。一旦你有了它,就有几种可能的解决方案来散列多个值。 通用散列函数,可以散列任何字节数组,en.wikipedia.org/wiki/…。 您不是在询问“姓名+电话”的哈希值吗?你的意思是如果你只有名字或只有电话,你想在哈希表中查找,但不是两者都有,不是吗?如果我是对的,您可以从上面的 cmets 中看到,您需要通过 editing 来澄清您的问题。 你的两把钥匙其实就是一把钥匙。就像电话号码是一把钥匙一样,即使它有 10 位数字。好吧,即使它有两部分,您的钥匙也是一把钥匙。 【参考方案1】:

一般方法是:

    将数据序列化为字节流。 为结果字节缓冲区创建一个std::string_view 并使用其哈希

第 1 步的有效解决方案可能难以实现,因为 C++ 没有标准的数据序列化方法。一个简单但非最佳的解决方案是简单地转换为文本字符串,在这种情况下我们也不需要字符串视图。

在您的示例中,您可以使用:

std::string data = name + std::to_string(phone);
std::size_t hash = std::hash<std::string>(data);

通过定义通用散列函数,您可以单独流式传输各个对象的字节,而无需先将它们存储在连续的缓冲区中。

【讨论】:

以上是关于如何实现具有两个或更多键的哈希函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用整数值作为哈希表的键是多么愚蠢?

来自哈希函数的相同键的不同值和良好的哈希值

哈希算法原理

iOS中的哈希表

Jpbc哈希函数如何实现

如何获取两个数组相同元素