Hash 计算散列的速度有多快?

Hash 计算散列的速度有多快?,hash,time-complexity,Hash,Time Complexity,它是在O(1)或O(n)中完成的,还是介于两者之间的某个地方?计算一个非常大的对象和一个小对象的散列有什么缺点吗?如果有关系的话,我使用的是Python。大多数情况下,您的哈希将在O(1)的access中计算。然而,如果它是一个非常糟糕的散列,其中每个值都有相同的散列,那么它将是O(n)最坏的情况 与散列关联的对象越多,冲突就越多 一般来说,“小”项的散列计算为O(1),而“大”项的散列计算为O(N)(其中“N”表示项的键的大小)。大小之间的精确分界线各不相同,但通常位于寄存器大小的大致附近(例

它是在O(1)或O(n)中完成的,还是介于两者之间的某个地方?计算一个非常大的对象和一个小对象的散列有什么缺点吗?如果有关系的话,我使用的是Python。

大多数情况下,您的哈希将在O(1)的access中计算。然而,如果它是一个非常糟糕的散列,其中每个值都有相同的散列,那么它将是O(n)最坏的情况


与散列关联的对象越多,冲突就越多

一般来说,“小”项的散列计算为O(1),而“大”项的散列计算为O(N)(其中“N”表示项的键的大小)。大小之间的精确分界线各不相同,但通常位于寄存器大小的大致附近(例如,32位机器上的32位,64位机器上的64位)。这也可能取决于输入类型——例如,寄存器大小上的整数类型所有散列都具有恒定的复杂性,但字符串的时间与字节大小成比例,一直到单个字符(即,两个字符的字符串的时间大约是单个字符串的两倍)


一旦计算了散列,访问散列表的复杂度应该是恒定的,但在最坏的情况下可能会达到O(N)(但这是一个不同的“N”——插入表中的项数,而不是单个键的大小)。

真正的答案取决于此。您没有指定您感兴趣的哈希函数。当我们谈论像SHA256这样的加密散列时,复杂性是O(n)。当我们讨论的哈希函数取电话号码的最后两位数字时,它将是O(1)。散列表中使用的散列函数往往会针对速度进行优化,因此更接近O(1)


有关哈希表的更多参考信息,请参阅python wiki上的本页。

取决于哈希函数的实现。一个插件:与较小的对象相比,与较大的对象发生冲突的可能性更高吗?嗯,我的回答仍然是一样的,冲突取决于算法。您可能有一个100个字符长的字符串,另一个只有1个字符长。现在,如果您的哈希函数只考虑字符串的第一个字符,则会发生大量冲突。问题是关于加密哈希函数或其他类型(如字典中使用的哈希函数)的问题吗?渐进复杂性可能不是讨论小输入大小的运行时间的最合适工具,从技术上讲,它只关心当我们接近无穷大时会发生什么。另外,你能不能说它是O(N/32)或O(N/64)(=O(N))从N=1开始的?也许更重要的是,复杂性将完全取决于您实际如何计算哈希-我不认为有规则规定您每字节只能做O(1)个工作来计算哈希。谢谢。从某种程度上讲,这是否意味着一个字符串占用64位,而两个字符串占用128位?(假设是一台64位机器)@Vic:No——通常一个字符会占用一到四个字节,但任何大于这个字节的字符都非常罕见。@Dukeling:当然,你可以做很多事情。不管您使用什么符号,似乎有些人关心(例如)1和100000000通常需要相同的时间进行散列,但“abcd”的散列时间大约是“a”的四倍。