如果哈希函数不是常数,哈希表查找时间会令人困惑

问题描述 投票:0回答:1

在哈希表中,我们一般说插入/查找时间为O(1)。

我读到,只有当使用的散列函数具有恒定时间时,这才是正确的,并且据说恒定时间取决于我们使用的密钥的长度。在某些情况下,插入时间会变成 O(k)。

问题 1: 编程语言是否使用实际的 hash(sha256, keccak256) 方法?我正在谈论 Java 中的

hashCode
函数。

问题 2: 如果编程语言使用 keccak256 或 sha 等哈希函数来确定哈希表中某个键的 hashCode,那么我同意哈希表中的插入时间可能会超过 O(1)。但我刚刚尝试了 keccak256 长度为 10000 的文本,它是即时的,这就引出了一个问题:长文本的散列如何将插入时间从 O(1) 增加到 O(k) ?我对哈希函数本身没有经验,因此无需解释该部分。只是一个概述解释为什么它是 O(k) 而不是 O(1),而对于我的长文本来说它是即时的,将不胜感激。

algorithm data-structures hash hashtable
1个回答
0
投票
  1. 用于哈希表的哈希函数通常比 sha256 或 keckak256 简单得多。例如,对于字符串,Java 使用简单的 32 位多项式哈希。计算记录如下:https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#hashCode

  2. 哈希表插入时间通常被引用为expected常数时间,但这确实假设固定长度的键。对于可变长度密钥,插入时间绝对增加到 O(k),其中 k 是密钥长度……但计算机似乎比您想象的要快得多。你说“我刚刚尝试了 keccak256,文本长度为 10000,它是即时的”,但事实并非如此。然而,计算该哈希值可能只需要几微秒,所以我确信它对您来说看起来是即时的。这样做几百万次,就会开始累积。

© www.soinside.com 2019 - 2024. All rights reserved.