【发布时间】:2013-03-12 13:27:53
【问题描述】:
我想知道将 typeid().hash_code() 返回的 size_t 存储到一个恒定大小的 16 位无符号整数中是否可以认为是安全的,或者这是否可能会产生冲突。这样做最安全的模式是什么?
谢谢!
【问题讨论】:
-
这在很大程度上取决于
size_t的大小 -
是的,我知道,size_t 可能是 16 位甚至更小,所以可能没问题。但是如果 size_t 通常是 32 位或 64 位呢?我不想在复杂的代码中引入不可能发现的错误!
-
可能是一个相对术语 - 但如果您采用 n 位值并将其压缩为 m 应该是相当直观的-bit 值(即如果 n > m)那么你会遇到冲突。这些冲突的频率取决于许多因素,所有这些因素(在这种情况下)对于所有意图和目的都是未定义的。
-
安全和产生碰撞并不像你想象的那样相互排斥。您必须处理两种不同类型生成相同哈希码的情况,就像哈希映射一样。散列是一种将值放入存储桶的方法,因此您只比较同一存储桶中的值,而不是每一个。您仍然可以最终将两个不同的值放在同一个存储桶中(根据鸽洞原理,最终必须这样做)。假设你的实现总是为
hash_code()返回 0。 -
@GManNickG 谢谢,现在我也从大卫的回答中得到了这个概念。
标签: c++ hash types c++11 type-conversion