【问题标题】:Please help me chose a hash请帮我选择一个哈希
【发布时间】:2011-09-08 23:54:01
【问题描述】:

我正在尝试为 10 或 16 字节的字符串创建哈希。这些字符串要么是以太网 MAC 地址 + ip 地址(6 + 4 个字节),要么只是一个 ipv6 ip(16 个字节)。

理想情况下,我想保留我的蛋糕并吃掉它。绝对最小的碰撞将是优先事项。散列的长度必须小于 16 字节并且相当快。

知道我应该从哪里开始吗?

【问题讨论】:

  • 哈希的目的和优先级是什么?快速插入?快速搜索?删除重复项?
  • 我猜是快速插入,使用它们构建指向主机信息的映射。我正在阅读“CHD算法”。到目前为止听起来很有希望。
  • big-O 对于固定的输入大小毫无意义。
  • @Matthew 为什么不直接使用现有的哈希表实现?为什么需要自定义哈希?
  • @Nick,我没有告诉你我使用的是哪种语言。我不知道 C++ 中有一个现有的哈希表实现。我必须去提升吗?矢量或地图只是一个好东西吗? AFAIK 地图将在 O(logn) 找到并使用 BST;所以我更喜欢使用哈希表。

标签: algorithm hash


【解决方案1】:

也许我遗漏了一些东西,但是如果您要散列的数据不长于您的散列,那么显而易见的候选者是使用数据本身作为散列 - 如果短于 16 个字节,则用零填充:我怀疑任何事情在简单性或冲突方面可以击败它。

【讨论】:

  • 我认为你是对的。我想在记录和传输这个主机 ID 时,我必须花费 16 个字节。
  • 想一想,这可能是一个很好的(如果有点恶作剧)考试题... :-)
【解决方案2】:

这个问题有点像Fast String Hashing Algorithm with low collision rates with 32 bit integer 的重复。如果您关心速度,请从那里的参考资料开始。 (MurmurHash 似乎是共识选择。)

如果性能不是一个大问题,只需获取一个 SHA-1 库并使用 20 个字节输出中的前 16 个。这对于使用该库的代码来说是微不足道的,并且可以尽可能地抵抗冲突。

[编辑]

正如 John Flatness 在评论中指出的那样,MD5 也符合要求。我怀疑现在找到 SHA-1 库会比 MD5 更容易(因为 MD5 几年前就被破解了),但是任何你方便的都可以,因为这不是加密应用程序。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多