哈希 Table 混淆 - 哈希 Table 需要多少 space 和良好的(例如密码学)哈希函数?
Hash Table Confusion - How much space is needed for Hash Table with a good (eg. Cryptographic) Hash Function?
我正在学习哈希 Tables、哈希映射等。我刚刚在 C 中实现了一个哈希 Table,操作:insert(HTable, key)
、delete(HTable, key)
、 initialize(HTable)
和 search(HTable, key)
.
我想请教一下。由于在(适当的)哈希 Table 中计算的哈希索引可能非常大,这是否意味着消耗的 space 会像 INT_MAX
(仍然是 O(n)当然)或更多?我的意思是给定我们要存储在散列 table 中的输入元素(即将其插入),insert() 函数将调用散列函数,该函数随后将计算要插入的元素的散列索引。因此它将使用散列函数来找到这个索引。
当我们使用散列函数对元素进行操作时,散列索引可能会变得非常大。有了适当的,例如加密哈希函数,这个索引可能会变得很大(他们使用 300 位的质数 - Diffie Hellman public 密钥加密等),对吧?我知道在正常的散列函数(例如初学者用来学习的琐碎的散列函数)中,我们应用 mod 操作以使元素适合散列 table 的范围,但这样做时,也许我们限制了哈希函数的潜力?
因此,要将元素唯一映射到散列 table,我们必须使用巨大的散列 Table。这些加密哈希 table 是如何实现的?它们一定是完全安全的,对吧?甚至 "cryptographichashfunction" 上的 Stack Overflow 标签也表示,极不可能找到将映射到同一元素的两个输入(因此发生冲突的可能性很小)。这是否需要将一个巨大的数组存储在内存中(或磁盘)?因此,内存消耗将是巨大的。
当然,时间复杂度不是问题。我们只是看到哈希table/数组的起始地址加上索引,然后去内存中的那个地方得到值(O(1) - 哈希Table的搜索原理)。
我哪里错了吗?有什么我想念的吗?我希望我说清楚了。所以总而言之,我想确认这一点。一个好的散列函数是否需要一个巨大的数组 (Hash Table) 以及如此大量的内存才能正确实现?这么多 space 是合理的,还是我不太明白?谢谢。
一般来说,加密哈希值 而不是 用于哈希 table。取而代之的是使用快速散列。该散列值中只有尽可能多的位可用于调整 table 的大小。如果多个键值映射到同一个索引,那么这些值将存储在一个单独的结构中,可能带有额外信息以在两者之间进行选择。
不要求哈希输出是唯一的;散列函数输出太大,所需的 table 肯定不适合内存。除此之外,加密哈希通常很慢。
加密哈希函数通常是从对称分组密码中也使用的操作构建的。这意味着在大量回合中使用混合和按位运算符。模块化算法,例如用于通常 不 使用 RSA。
总而言之,主要是生成的索引不需要是唯一的。通常,如果一个散列导致多个值,它们将存储在列表中或设置键可以按值进行比较的位置。
我正在学习哈希 Tables、哈希映射等。我刚刚在 C 中实现了一个哈希 Table,操作:insert(HTable, key)
、delete(HTable, key)
、 initialize(HTable)
和 search(HTable, key)
.
我想请教一下。由于在(适当的)哈希 Table 中计算的哈希索引可能非常大,这是否意味着消耗的 space 会像 INT_MAX
(仍然是 O(n)当然)或更多?我的意思是给定我们要存储在散列 table 中的输入元素(即将其插入),insert() 函数将调用散列函数,该函数随后将计算要插入的元素的散列索引。因此它将使用散列函数来找到这个索引。
当我们使用散列函数对元素进行操作时,散列索引可能会变得非常大。有了适当的,例如加密哈希函数,这个索引可能会变得很大(他们使用 300 位的质数 - Diffie Hellman public 密钥加密等),对吧?我知道在正常的散列函数(例如初学者用来学习的琐碎的散列函数)中,我们应用 mod 操作以使元素适合散列 table 的范围,但这样做时,也许我们限制了哈希函数的潜力?
因此,要将元素唯一映射到散列 table,我们必须使用巨大的散列 Table。这些加密哈希 table 是如何实现的?它们一定是完全安全的,对吧?甚至 "cryptographichashfunction" 上的 Stack Overflow 标签也表示,极不可能找到将映射到同一元素的两个输入(因此发生冲突的可能性很小)。这是否需要将一个巨大的数组存储在内存中(或磁盘)?因此,内存消耗将是巨大的。
当然,时间复杂度不是问题。我们只是看到哈希table/数组的起始地址加上索引,然后去内存中的那个地方得到值(O(1) - 哈希Table的搜索原理)。
我哪里错了吗?有什么我想念的吗?我希望我说清楚了。所以总而言之,我想确认这一点。一个好的散列函数是否需要一个巨大的数组 (Hash Table) 以及如此大量的内存才能正确实现?这么多 space 是合理的,还是我不太明白?谢谢。
一般来说,加密哈希值 而不是 用于哈希 table。取而代之的是使用快速散列。该散列值中只有尽可能多的位可用于调整 table 的大小。如果多个键值映射到同一个索引,那么这些值将存储在一个单独的结构中,可能带有额外信息以在两者之间进行选择。
不要求哈希输出是唯一的;散列函数输出太大,所需的 table 肯定不适合内存。除此之外,加密哈希通常很慢。
加密哈希函数通常是从对称分组密码中也使用的操作构建的。这意味着在大量回合中使用混合和按位运算符。模块化算法,例如用于通常 不 使用 RSA。
总而言之,主要是生成的索引不需要是唯一的。通常,如果一个散列导致多个值,它们将存储在列表中或设置键可以按值进行比较的位置。