0

我正在学习哈希表,哈希映射等。我刚刚在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) - 哈希表的搜索原理)。

我在哪里错了吗?有什么我失踪?我希望我明确自己。所以最后,我想就此确认。一个好的散列函数是否需要一个巨大的数组(哈希表),以及如此大量的内存才能正确实现?有太多的空间是正确的,还是有我不完全得到的东西?谢谢。

+1

散列函数是二进制算术运算。那里(通常)根本没有素数或大数字。大多数计算是二元的。 SHA-256是一种非常流行的密码散列函数。 256 **位**太大了吗?我不知道。 –

+0

许多流行的散列函数用于非加密目的* do *使用主/幻数。例如,Java的['String.hashCode()'](https://stackoverflow.com/questions/299304/)。 –

回答

3

一般来说,用于散列表的密码散列值是而不是。而是使用快速散列。在该散列值中,只有很多位可以用​​来调整表的大小。如果多个键值映射到相同的索引,则这些值与附加信息一起存储以在两者之间进行选择。

不要求散列输出是唯一的;散列函数输出将会过大,并且所需的表格肯定不适合内存。除此之外,密码哈希通常很慢。

加密哈希函数通常是从也用于对称分组密码的操作构建而成的。这意味着在大量循环中使用混合和按位运算符。模块化算术,如用于例如RSA是而不是使用。

你似乎没有得到的主要原因是生成的索引不需要是唯一的。有其他方法可以区分关键值。