zoukankan      html  css  js  c++  java
  • 算法笔记-散列表、哈希

    【散列表】

    散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。
     
    散列函数,可以把它定义成hash(key),其中 key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值。
     
    散列函数设计的基本要求:
        1. 散列函数计算得到的散列值是一个非负整数;
        2. 如果 key1 = key2,那 hash(key1) == hash(key2);
        3. 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。
     
    散列冲突
    再好的散列函数也无法避免散列冲突。常用的散列冲突解决方法有两类,开放寻址法(open addressing)和链表法(chaining)。
     
    开放寻址法的核心思想是,如果出现了散列冲突,我们就重新探测一个空闲位置,将其插入。三种探测方法是:线性探测(Linear Probing)、二次探测(Quadratic probing)、双重散列(Double hashing)。
     

     【哈希】

    哈希算法的定义:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。常见的例如:MD5、SHA。
     
    设计一个优秀的哈希算法需要满足的几点要求:
    • 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
    • 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;
    • 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
    • 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
     
     
    哈希算法的七个常见应用:
    • 安全加密:MD5、SHA、DES、AES。很难根据哈希值反向推导出原始数据;散列冲突的概率要很小(因为无法做到零冲突)。
    • 唯一标识:哈希算法可以对大数据做信息摘要,通过一个较短的二进制编码来表示很大的数据。
      • 海量的图库中,搜索一张图是否存在
    • 数据校验:校验数据的完整性和正确性。
    • 散列函数:对哈希算法的要求非常特别,更加看重的是散列的平均性和哈希算法的执行效率。
    • 负载均衡:利用哈希算法替代映射表,可以实现一个会话粘滞的负载均衡策略。
      • 在同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上。
    • 数据分片:通过哈希算法对处理的海量数据进行分片,多机分布式处理,可以突破单机资源的限制。
      • 如何统计“搜索关键词”出现的次数?
      • 如何快速判断图片是否在图库中?
    • 分布式存储:利用一致性哈希算法,可以解决缓存等分布式系统的扩容、缩容导致数据大量搬移的难题。
      • 如何决定将哪个数据放到哪个机器上?
      • 一致性哈希算法
     
     
  • 相关阅读:
    正则表达式获取远程网页
    Devexpress 常见问题
    CSS 带显示隐藏左部页面按钮
    CSS 技巧积累
    SQL 常用操作
    重置 自增字段 起始值 和 步长
    Devexpress TreeList
    Devexpress GridControl
    JS常用
    ajax跨域请求
  • 原文地址:https://www.cnblogs.com/rxbook/p/10452620.html
Copyright © 2011-2022 走看看