发布时间:2025-11-16 21:57:32 点击量:
HASH GAME - Online Skill Game GET 300
散列函数 又称 hash 函数, Hash 函数 (也称杂凑函数或杂凑算法 )就是把任意长的输入消息 串变化成固定长的输出串的一种函数。这个输出串称为该消息的杂凑值。一般用于产 生消息摘要,密钥加密等 . 一个安全的杂凑函数应该至少满足以下几个条件 : ①输入长度是任意的 ; ②输出长度是固定的 ,根据目前的计算技术应至少取 128bits 长 , 以便抵抗生日攻击 ; ③对每一个给定的输入 ,计算输出即杂凑值是很容易的 ④给定杂凑函数的描述 ,找到两个不同的输入消息杂凑到同一个值是计算上不可 行的 ,或给定杂凑函数的描述和一个随机选择的消息 ,找到另一个与该消息不同的消息 使得它们杂凑到同一个值是计算上不可行的。 Hash 函数主要用于完整性校验和提高数字签名的有效性 , 目前已有很多方案。这 些算法都是伪随机函数 ,任何杂凑值都是等可能的。输出并不以可辨别的方式依赖于 输入 ;在任何输入串中单个比特的变化 ,将会导致输出比特串中大约一半的比特发生变 化。 常见散列函数 (Hash 函数 ) ·MD5 (Message Digest Algorithm 5 ):是 RSA 数据安全公司开发的一种单向散 列算法, MD5 被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个 128 位 的数值; SHA· (Secure Hash Algorithm )这是一种较新的散列算法,可以对任意长度的 数据运算生成一个 160 位的数值; ·MAC (Message Authentication Code ):消息认证代码,是一种使用密钥的单向 函数,可以用它们在系统上或用户之间认证文件或消息。 HMAC (用于消息认证的密 钥散列法)就是这种函数的一个例子。 ·CRC (Cyclic Redundancy Check ):循环冗余校验码, CRC 校验由于实现简单, 检错能力强,被广泛使用在各种数据校验应用中。占用 系统资源 少,用软硬件均能实 现,是进行数据传输差错检测地一种很好的手段( CRC 并不是严格意义上的散列算 法,但它的作用与散列算法大致相同,所以归于此类) 。 讨论几种散列函数。在以下的讨论中,我们假设处理的是值为整型的关键码,否 则我们总可以建立一种关键码与正整数之间的一一对应关系, 从而把该关键码的检索 转化为对与其对应的正整数的检索;同时,进一步假定散列函数的值落在 0 到 M - 1 之间。 散列函数的选取原则是: 运算尽可能简单; 函数的值域必须在散列表的范围内; 尽可能使得结点均匀分布,也就是尽量让不同的关键码具有不同的散列函数值。需要 考虑各种因素:关键码长度、散列表大小、关键码分布情况、记录的检索频率等等。 下面我们介绍几种常用的散列函数。 1 、除余法 顾名思义,除余法就是用关键码 x 除以 M (往往取散列表长度) ,并取余数作为 散列地址。除余法几乎是最简单的散列方法,散列函数为: h(x) = x mod M 。 2 、乘余取整法 使用此方法时,先让关键码 key 乘上一个常数 A (0 A 1) ,提取乘积的小数部 分。然后,再用整数 n 乘以这个值,对结果向下取整,把它做为散列的地址。散列函 数为: hash ( key ) = _LOW( n × ( A × key % 1 ) ) 。 其中, “A × key % 1 ”表示取 A × key 小数部分,即: A × key % 1 = A × key - _LOW(A × key), 而 _LOW(X) 是表示对 X 取下整。 3 、平方取中法 由于整数相除的运行速度通常比相乘要慢, 所以有意识地避免使用除余法运算可 以提高散列算法的运行时间。平方取中法的具体实现是:先通过求关键码的平方值, 从而扩大相近数的差别,然后根据表长度取中间的几位数(往往取二进制的比特位) 作为散列函数值。因为一个乘积的中间几位数与乘数的每一数位都相关,所以由此产 生的散列地址较为均匀。 4 、数字分析法 设有 n 个 d 位数,每一位可能有 r 种不同的符号。这 r 种不同的符号在各位 上出现的频率不一定相同,可能在某些位上分布均匀些,每种符号出现的几率均等