散列算法和散列函数
散列是一个字符串的变换字符s转换表示原始字符串通常短固定长度值或密钥。散列用于索引和检索数据库中的项目,因为使用较短的散列键查找项目比使用原始值查找项目更快。它也用于许多加密算法。
作为在数据库中使用散列的一个简单示例,可以将一组人员安排在数据库中,如下所示:
Abernathy,Sara Epperdingle,Roscoe Moore,Wilfred Smith,David(以及更多按字母顺序排序)
这些名称中的每一个都是数据库中该人员数据的关键。数据库搜索机制首先必须开始逐个字符地查找匹配的名称,直到找到匹配(或者将其他条目排除在外)。但是,如果每个名称都经过哈希处理,则可能(根据数据库中的名称数量)为每个名称生成唯一的四位数密钥。例如:
7864 Abernathy,Sara 9802 Epperdingle,Roscoe 1990 Moore,Wilfred 8822 Smith,David(等等)
搜索任何名称将首先包括计算哈希值(使用用于存储项目的相同哈希函数),然后使用该值比较匹配。一般来说,找到四个数字的匹配要快得多,每个数字只有10种可能性,而不是每个字符有26种可能性的不可预测的值长度。
散列算法称为散列函数 -可能该术语源自所得到的散列值可被视为所表示的值的“混合”版本的想法。
除了更快的数据检索之外,散列还用于加密和解密数字签名(用于验证消息发送者和接收者)。该数字签名与散列函数,然后这两个散列值(被称为消息摘要)和签名转化在单独的传输到所述接收器被发送。使用与发送方相同的散列函数,接收方从签名中导出消息摘要,并将其与它也收到的消息摘要进行比较。(他们应该是一样的。)
散列函数用于索引原始值或密钥,然后在每次检索与值或密钥相关联的数据时使用。因此,散列始终是单向操作。通过分析散列值,无需“反向工程”散列函数。实际上,这种分析无法导出理想的散列函数。良好的散列函数也不应该从两个不同的输入产生相同的散列值。如果是这样,这称为碰撞。可以认为提供极低碰撞风险的散列函数是可接受的。
以下是一些相对简单的哈希函数:
除法余数法:估算表格中项目数量的大小。然后将该数字用作每个原始值或键的除数,以提取商和余数。余数是散列值。(由于此方法容易产生大量冲突,因此任何搜索机制都必须能够识别冲突并提供备用搜索机制。) 折叠方法:此方法将原始值(本例中的数字)分成几个部分,将各部分相加,然后使用最后四位数(或其他任意数字的数字)作为散列值或键。 基数变换方法:当值或键是数字时,可以改变数字基数(或基数),从而产生不同的数字序列。(例如,十进制数字键可以转换为十六进制数字键。)可以丢弃高位数以适合均匀长度的哈希值。 数字重排方法:这只是将原始值或键的一部分(例如位置3到6中的数字),反转它们的顺序,然后使用该数字序列作为哈希值或键。
密码学中使用了几种众所周知的哈希函数。这些包括消息摘要散列函数MD2,MD4和MD5,用于将数字签名散列为称为消息摘要的较短值,以及安全散列算法(SHA),一种标准算法,使得更大(60- bit)消息摘要,类似于MD4。但是,适用于数据库存储和检索的哈希函数可能无法用于加密或错误检查。
声明:本站所提供的资讯信息不代表任何投资暗示, 本站所发布文章仅代表个人观点,仅供参考。