我正在学习哈希表,哈希地图等。我刚刚在C中实现了一个哈希表,其中包含操作:insert(HTable, key)
,delete(HTable, key)
,initialize(HTable)
和search(HTable, key)
我想问一些问题。由于在(适当的)散列表中,计算的散列索引可能非常大,这并不意味着消耗的空间将类似于INT_MAX
(当然仍为O(n))或更多?我的意思是给定我们想要存储在哈希表中的输入元素(即插入它),insert()函数将调用哈希函数,然后哈希函数将计算要进入的元素的哈希索引。因此它将使用用于查找此索引的哈希函数。
当我们使用哈希函数对元素进行操作时,哈希索引会变得非常大。使用适当的加密哈希函数,这个索引可能变得很大(它们使用300位数的素数 - Diffie Hellman公钥加密等),对吧?我知道在普通的哈希函数中(比如初学者习惯学习的那些)我们应用mod操作以使元素适合哈希表的边界,但是这样做,我们可能会限制哈希函数电势φ
因此,为了将元素唯一地映射到哈希表,我们必须使用巨大的哈希表。这些加密哈希表是如何实现的?他们必须完全安全,对吗?甚至Stack overflow标签都在" cryptographichashfunction"他说,极不可能找到两个映射到同一元素的输入(因此碰撞的可能性很小)。这不需要将巨大的数组存储在内存(或磁盘)中吗?因此,内存消耗将是巨大的。
当然,时间复杂度不是问题。我们只看到哈希表/数组的起始地址,用索引添加它,然后在内存中去那个地方获取值(O(1) - 哈希表的搜索原理)。
我错了吗?有什么我想念的吗?我希望我清楚自己。总而言之,我想对此进行确认。一个好的哈希函数是否需要一个庞大的数组(哈希表),因此需要正确实现大量的内存?这么多的空间是否合理,或者有什么我不能得到的东西?感谢。
答案 0 :(得分:4)
通常,加密哈希值不用于哈希表。而是使用快速哈希。在该哈希值中,只有很多位可用于调整表的大小。如果多个键值映射到同一个索引,则这些值与其他信息一起存储,以便在两者之间进行选择。
散列输出不是唯一的;哈希函数输出太大,所需的表肯定不适合内存。除此之外,加密哈希通常很慢。
加密哈希函数通常是在对称分组密码中使用的操作构建的。这意味着在大量轮次中使用混合和按位运算符。模数运算,如用于例如RSA 不使用。
您似乎没有得到的主要内容是生成的索引不需要是唯一的。否则,有一些方法可以区分关键值。