我正在学习哈希表,哈希映射等。我刚刚在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 **位**太大了吗?我不知道。 –
许多流行的散列函数用于非加密目的* do *使用主/幻数。例如,Java的['String.hashCode()'](https://stackoverflow.com/questions/299304/)。 –