【问题标题】:Hash Table Confusion - How much space is needed for Hash Table with a good (eg. Cryptographic) Hash Function?哈希表混淆 - 具有良好(例如加密)哈希函数的哈希表需要多少空间?
【发布时间】:2017-11-15 18:19:54
【问题描述】:

我正在学习哈希表、哈希映射等。我刚刚用 C 语言实现了一个哈希表,操作:insert(HTable, key)delete(HTable, key)initialize(HTable)search(HTable, key)

我想问一些事情。由于在(正确的)哈希表中计算的哈希索引可能非常大,这是否意味着消耗的空间将像INT_MAX(当然仍然是 O(n))或更多?我的意思是给定我们要存储在哈希表中(即插入)的输入元素,insert() 函数将调用哈希函数,然后计算要进入的元素的哈希索引。因此它将使用找到这个索引的哈希函数。

当我们使用哈希函数对元素进行操作时,哈希索引可能会变得非常大。使用适当的,例如加密散列函数,这个索引可能会变得很大(他们使用 300 位的素数 - Diffie Hellman 公钥加密等),对吧?我知道在普通散列函数中(例如初学者用来学习的琐碎函数)我们应用 mod 操作以使元素适合散列表的边界,但是这样做,也许我们限制了散列函数的潜力?

所以要将一个元素唯一地映射到哈希表,我们必须使用一个巨大的哈希表。这些加密哈希表是如何实现的?它们必须是完全安全的,对吧?甚至“cryptographichashfunction”上的 Stack Overflow 标签也表示极不可能找到将映射到同一元素的两个输入(因此发生冲突的可能性很小)。这不需要将一个巨大的数组存储在内存(或磁盘)中吗?因此,内存消耗将是巨大的。

当然,时间复杂度不是问题。我们只是看到哈希表/数组的起始地址加上索引,然后去内存中的那个地方取值(O(1)-哈希表的搜索原理)。

我是不是哪里错了?有什么我想念的吗?我希望我说清楚了。因此,总而言之,我想对此进行确认。一个好的哈希函数是否需要一个巨大的数组(哈希表)以及如此大量的内存才能正确实现?这么大的空间是合理的,还是我不太明白?谢谢。

【问题讨论】:

  • 哈希函数是二进制而不是算术。 (通常)根本没有素数或大数。大多数计算都是二进制的。 SHA-256 是一种非常流行的加密哈希函数。 256 bit 太大了吗?我不知道。
  • 许多用于非加密目的的流行散列函数确实使用主数/幻数。比如Java的String.hashCode()

标签: hash cryptography hashtable hash-function cryptographic-hash-function


【解决方案1】:

一般来说,加密哈希值用于哈希表。而是使用快速哈希。在该哈希值中,只有尽可能多的位可用于调整表的大小。如果多个键值映射到同一个索引,则这些值将存储在一个单独的结构中,可能还有其他信息可以在两者之间进行选择。

哈希输出不要求唯一;散列函数输出太大,所需的表肯定不适合内存。除此之外,加密哈希通常很慢。

加密哈希函数通常由对称分组密码中使用的操作构建而成。这意味着在大量轮次中使用混合和按位运算符。模数运算,例如用于RSA 通常使用。

总而言之,主要是生成的索引不需要是唯一的。通常,如果一个哈希导致多个值,它们将存储在一个列表或集合中,可以按值比较键。

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2021-01-19
    • 2013-07-20
    • 2011-10-27
    • 2015-11-27
    • 2016-03-20
    • 2016-03-25
    • 2011-02-27
    相关资源
    最近更新 更多