【问题标题】:Hash Table - Why do we hash the keys instead of just using the input as the key?Hash Table - 为什么我们对键进行散列而不是仅使用输入作为键?
【发布时间】:2018-12-20 23:43:11
【问题描述】:

我正在学习哈希表,但不明白为什么要对键进行哈希处理。既然我们的哈希函数是幂等的,那有什么意义呢?为什么不直接使用散列函数的输入在我们的查找中使用?

我只知道 javascript,所以也许这与我没有完全理解它有关。

【问题讨论】:

  • 你建议如何使用字符串在数组中查找?
  • 我认为这条评论最有帮助。这是因为我们使用数字键来查找数组中的值?为什么是一个数组而不是一个对象?我来自对 j​​avascript 的理解。数据通常是按顺序存储在类似数组的结构中吗?
  • 你将如何实现它? Javascript 对象(通常)自己实现为哈希表。
  • 在底层,一切都只是 RAM 中特定(数字)地址的字节。
  • 明白了,现在说得通了。因此,我们将密钥散列到数字地址。谢谢。

标签: javascript data-structures hashtable


【解决方案1】:

因为它更快。根据所涉及的值,使用输入本身将是一个更昂贵的计算。由于它是一个必须处理多种类型 os 值的通用算法,因此使用值比使用字符串本身要好得多。

【讨论】:

  • 所以主要原因是我们的键被规范化了?对我来说很有意义!
【解决方案2】:

你说:

既然哈希函数的每个唯一输入都会产生相同的唯一输出,那么有什么意义呢?

这种说法显然是错误的。

例如,如果您的密钥是 16 个字符的字符串,并且您正在创建一个 32 位哈希码,那么通过 Pigeonhole Principle,您将发生冲突。

有 2^32(40 亿和变化)可能的 32 位整数。即使您的 16 个字符的字符串仅限于 26 个字母字符和数字 0-9,您也有 36^16 (7.95 e24) 个可能的字符串。因此,平均而言,每个可能的哈希码都有 1,853,020,188,851,841 个字符串。

这就是哈希表必须实施冲突解决策略的原因。这也是为什么选择一个好的哈希函数很重要的原因:您希望尽可能地消除这些冲突。

【讨论】:

  • 当我说唯一输出时我说错了,我的意思是说对于每个输入,输出哈希应该始终相同。我知道会发生碰撞,但它们并不是让我感到困惑的原因。
  • @icey-t 我建议您编辑您的问题并更正该声明。
猜你喜欢
  • 1970-01-01
  • 2021-07-04
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多