hash算法原理详解

http://www.javashuo.com/article/p-zqzjocdh-dt.html函数

能够将几种方法联合起来使用,好比先变基,再折叠或平方取中等等,只要散列均匀,就能够随意拼凑。spa

  • 直接定址法:

  • 数字分析法:

    • 取数据元素关键字中某些取值较均匀的数字位做为哈希地址的方法
    • 例2,要构造一个数据元素个数n=80,哈希长度m=100的哈希表。.net

      • 不失通常性,咱们这里只给出其中8个关键字进行分析,8个关键字以下所示:blog

        • K1=61317602      K2=61326875      K3=62739628      K4=61343634字符串

        • K5=62706815      K6=62774638      K7=61381262      K8=61394220get

      •  此法适于:能预先估计出全体关键字的每一位上各类数字出现的频度。原理

  • 折叠法:

    • 将关键字分割成位数相同的几部分(最后一部分的位数能够不一样),而后取这几部分的叠加和(舍去进位),这方法称为折叠法。
    • 这种方法适用于:
      • 关键字位数较多,并且关键字中每一位上数字分布大体均匀的状况。
  • 平方取中法:

    • 先取关键字的平方,而后根据可以使用空间的大小,选取平方数是中间几位为哈希地址
    • 原理是经过取平方扩大差异,平方值的中间几位和这个数的每一位都相关,
      • 则对不一样的关键字获得的哈希函数值不易产生冲突,
      • 由此产生的哈希地址也较为均匀
    • 此法适于:关键字中的每一位都有某些数字重复出现频度很高的现象
  • 减去法

    • 减去法是数据的键值减去一个特定的数值以求得数据存储的位置。
  • 基数转换法

    •   将十进制数X看做其余进制,
    • 好比十三进制,再按照十三进制数转换成十进制数,提取其中若干为做为X的哈希值。
    • 通常取大于原来基数的数做为转换的基数,而且两个基数应该是互素的
  • 除留余数法:

    • 理论研究代表,除留余数法的模p取不大于表长且最接近表长m素数时效果最好
  • 随机数法:

    •  此法适于:对长度不等的关键字构造哈希函数。
  • 随机乘数法

  • 字符串数值哈希法

  • 旋转法

    • 对于类似度高的数据,倒过来就很均匀了
相关文章
相关标签/搜索