【发布时间】:2020-08-15 21:42:29
【问题描述】:
我正在阅读有关散列的信息,我在here 中找到了以下语句:
C 字符串没有特化。
std::hash<const char*>生成指针值(内存地址)的哈希值,它不检查任何字符数组的内容。
为什么没有对检查其内容的 C 字符串进行哈希处理的机制?
我正在浏览std::string_view 的代码,似乎可以方便地同时涵盖std::string 和std::string_view。
编辑
感谢 cmets。我想我不是很清楚。我应该问为什么没有功能来散列 c 字符串并将其长度作为参数? hash(const char* data, size_t size) 将处理 nul,而不是 nul 终止的 c 字符串。
【问题讨论】:
-
const char*不必指向以 nul 结尾的字符串... -
@Jarod42 不知怎的,这并没有阻止提供
operator<<(ostream&, const char*)过载。 -
std::hash<std::string>{}(foo)有什么问题(foo是char const *)? -
顺便说一句:“
std::char_traits中有许多有用的操作可以(或可能已经)在std::string和std::string_view之间共享,但由于某种原因,散列是一个都没有。我想知道为什么。” -- 这与你问的问题不同。您问为什么标准 hasing 不处理 C 风格的字符串,而这个其他问题相当于问为什么散列不被视为命名要求的一部分 CharTraits。答案是相互独立的。请一次只回答一个问题。 -
第三个问题,这可能是您真正的问题,是如何使用标准工具计算 C 样式字符串的哈希,而无需触及实现细节。这是三个问题中最容易回答的问题,所以如果这是你真正的问题,很遗憾你在评论中隐藏它作为暗示(你应该在一个新问题中提出,如果这确实是你的问题有兴趣,如果你找不到它已经在这里回答)。