【问题标题】:quick access of hash function (without using string object)快速访问散列函数(不使用字符串对象)
【发布时间】:2015-11-16 11:24:49
【问题描述】:

下面的代码snippet可以对字符串对象做哈希值。我想获得一个二进制字符串(指针和长度)的哈希值。我知道我可以用指针和长度形成一个字符串对象,但是仅仅为此形成一个字符串会有额外的开销。想知道是否可以使用带有两个参数的 std 哈希函数:指针和长度。

谢谢。

#include <iostream>
#include <functional>
#include <string>

int main()
{
    std::string str = "Meet the new boss...";
    std::hash<std::string> hash_fn;
    std::size_t str_hash = hash_fn(str);

    std::cout << str_hash << '\n';
}

【问题讨论】:

  • 将 std::hash 专门用于包含指针和长度的自定义类?
  • 感谢@RichardHodges 的评论,您最终需要调用std::hash&lt;string&gt;() 来获取哈希值吗?
  • @codingFun - 您可能想查看 this answer to another question 以了解通过不构造短 std::string 节省了多少时间 - 大约 1 ns。

标签: c++ hash


【解决方案1】:

我在堆栈溢出中发现了这篇文章,它表明底层哈希函数实际上是字符串内部缓冲区中字节的函数:

What is the default hash function used in C++ std::unordered_map?

但是,与其通过调用标准库中的内部函数来冒未定义行为的风险,为什么不问一个问题:“创建std::string 会损失多少性能”?鉴于您始终可以创建像 static const 这样的字符串(零开销),我想知道您实际上要保存什么?

【讨论】:

  • 感谢@RichardHodges 提供链接。刚刚试了下,可以直接用:std::_Hash_impl::hash(const char*, int size)。 :-)
  • 啊!您今天可以,但不能保证它可以在所有系统上运行,甚至在库的下一个版本上运行。似乎一点知识是一件危险的事情......
  • 同意。一切都需要权衡:-) 再次感谢。
猜你喜欢
  • 2023-04-05
  • 2018-05-12
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多