计算机领域内的大多数查找算法都与存储数据的规模呈正相关,用于衡量查找算法效率的量我们称为平均查找长度,一般情况下,比较优秀的查找算法的平均查找长度也不会短于数据规模以2为底的对数(
)。
哈希算法中,我们把数据项中的关键字用一种特定的对应关系和存储数据项的地址或地址偏移量对应起来。注意:这种对应一般不是一一对应,因为不可能有足够多的地址对应近乎无穷多的关键字。
这样一来,当我们知道数据关键字的时候,在大多数情况下可以在常数时间(与数据规模无关的常数)内存取这个关键字。其他的时候,有可能发生多个关键字占据同一地址的现象,我们称之为碰撞。这种情况下需要对关键字进行二次或更多次的处理(如果发生多次碰撞),所费时间在最差情况下也只与规模成正比。
只要这种函数的对应关系取得足够好,碰撞就会较少的发生,从而使平均查找长度在数据规模可控的情况下大幅度缩短,从而提高查找效率。
哈希函数除此以外,也可以用来对广义上的字符串(例如文本、视频、图片、程序等等等等)进行特征验证。常见的有CRC32(32位循环冗余校验),从MD2、MD3、MD4发展而来的MD5(消息摘要算法第五版),SHA1(安全哈希算法)等等。
这类哈希算法的最初用途仅仅是对这些广义字符串进行完整性校验,因为在传输中损坏的比特位往往仅仅是极少数,这些少数的错误用上述提到的算法可以得出和原本正确文件截然不同的值,这也就使得文件完整性校验的开销得以缩小。
问题中描述的用途其实并不完全适当,但是在一定程度内可行。
因为访问的网络地址有无穷多个,但是所有的哈希算法生成的特征值都有限,在极端情况下,很有可能会出现两个不同的网络地址具有相同特征值的情况。
这不仅使得在得知特征值时,反向推测网络地址具有了可行性(虽然开销可能极大,需要大量时间穷举),而且在网络地址增长速度极快的今天,安全地址可能和危险地址发生碰撞导致误杀或者错误放行的情况(现在虽然可能还没出现过,但不能排除这种可能性)。
这种哈希算法本身虽然在理论上是不可逆的,但是它的思想保证了它也不是绝对可靠的。
哈希算法中,我们把数据项中的关键字用一种特定的对应关系和存储数据项的地址或地址偏移量对应起来。注意:这种对应一般不是一一对应,因为不可能有足够多的地址对应近乎无穷多的关键字。
这样一来,当我们知道数据关键字的时候,在大多数情况下可以在常数时间(与数据规模无关的常数)内存取这个关键字。其他的时候,有可能发生多个关键字占据同一地址的现象,我们称之为碰撞。这种情况下需要对关键字进行二次或更多次的处理(如果发生多次碰撞),所费时间在最差情况下也只与规模成正比。
只要这种函数的对应关系取得足够好,碰撞就会较少的发生,从而使平均查找长度在数据规模可控的情况下大幅度缩短,从而提高查找效率。
哈希函数除此以外,也可以用来对广义上的字符串(例如文本、视频、图片、程序等等等等)进行特征验证。常见的有CRC32(32位循环冗余校验),从MD2、MD3、MD4发展而来的MD5(消息摘要算法第五版),SHA1(安全哈希算法)等等。
这类哈希算法的最初用途仅仅是对这些广义字符串进行完整性校验,因为在传输中损坏的比特位往往仅仅是极少数,这些少数的错误用上述提到的算法可以得出和原本正确文件截然不同的值,这也就使得文件完整性校验的开销得以缩小。
问题中描述的用途其实并不完全适当,但是在一定程度内可行。
因为访问的网络地址有无穷多个,但是所有的哈希算法生成的特征值都有限,在极端情况下,很有可能会出现两个不同的网络地址具有相同特征值的情况。
这不仅使得在得知特征值时,反向推测网络地址具有了可行性(虽然开销可能极大,需要大量时间穷举),而且在网络地址增长速度极快的今天,安全地址可能和危险地址发生碰撞导致误杀或者错误放行的情况(现在虽然可能还没出现过,但不能排除这种可能性)。
这种哈希算法本身虽然在理论上是不可逆的,但是它的思想保证了它也不是绝对可靠的。