【问题标题】:Store a typeid().hash_code() into a 16 bits integer将 typeid().hash_code() 存储为 16 位整数
【发布时间】: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


【解决方案1】:

这是安全的,也可能会产生碰撞。碰撞没有什么“不安全”的。碰撞只会稍微降低性能,因为如果哈希发生碰撞,您必须比较更多完整的值。

不匹配的哈希码确保值无法匹配。匹配的哈希码仅意味着它们可能相同。哈希码用于减少所需的完整比较次数 - 您只需比较哈希码匹配的事物的值。

【讨论】:

  • 请把你的答案放在上下文中。 1)检测碰撞意味着提前计算所有的哈希值。 2)解决冲突不仅仅是比较完整值那么简单,但我应该以某种方式为第二种类型分配一个不同的哈希......然后我不能再使用 typeid(type2).hash_code() 了,但我需要包装这个函数转换为另一个返回正确修改值的函数。这真的是要走的路吗?
  • @DarioP: 1) 不,它没有。 2)是的,是的。 (您可以使用 typeid(type2)hash_code() 来减少所需的比较次数。无需将其与每个可能的 typeid 进行比较,您只需将其与具有相同 hash_code 的那些进行比较,这应该是其中的一小部分-- 通常 1.)
  • @DarioP 为什么你觉得你应该你分配一个不同的哈希值给type2,如果它的“减少”哈希匹配type1的“减少”哈希?如果您解释一下您尝试将“16 位哈希码”用于什么目的,将会有所帮助。
  • @Nik Bougalis:我正在构建一个查找表来解决多(双)分派问题。
  • @DavidSchwartz 谢谢,现在我明白你的意思了。我使用与每种类型关联的增量整数解决了特定问题,但是我仍然对原始问题感到好奇:在给定 n:项目数和 N:项目数的情况下,哈希算法产生冲突的情况如何?可代表的项目?答案是否取决于算法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2014-03-29
  • 2014-07-03
相关资源
最近更新 更多