HashMap 的长度为什么是2的幂次方?

为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ (n - 1) & hash”。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。

这个算法应该如何设计呢?

我们首先可能会想到采用%取余的操作来实现。但是,重点来了:“取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是2的幂次方。

那么 a % b 操作为什么等于 a & ( b - 1 )呢? (前提是b等于2的n次幂)

举例说明:
若 a = 10 , b = 8 , 10与8取余应得2.
8的二进制为: 1000 ; 7的二进制为: 0111.
也就是说-----2的n次幂减一这样的数的二进制都是如0000111111这样前半部分是0后半部分是1的形式.
所以, 用2的n次幂减一这样的数 & 另一个数就相当于 这个数取余 (%) 2的n次幂

hash % n 为什么等于 (n - 1) hash相关推荐

  1. 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题

    HashMap 前言 Hash HashTable 开地址法 线性探测法 平方探测法 双重散列探测法 拉链法 哈希表优势 HashMap 变量介绍 初始容量和负载因子 红黑树和链表转化 HashMap ...

  2. Hash冲突的解决--暴雪的Hash算法

    Hash冲突的解决--暴雪的Hash算法 https://usench.iteye.com/blog/2199399 https://www.bbsmax.com/A/kPzOO7a8zx/ 转载于: ...

  3. hash算法_到底什么是Hash?Hash算法的原理和实际应用讲解

    提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解. 1.什么是Has ...

  4. ora hash oracle官网,oracle计算hash值

    oracle计算hash值 1.dbms_utility.get_hash_value( name VARCHAR2, base NUMBER, hash_size NUMBER ) 函数说明 nam ...

  5. Hash(哈希)简述 —— Hash函数、Hash值、HashTable、HashMap

    总览 - Hash(哈希.散列) Hash是一种 散列函数或方法 的统称. · 该方法就是:把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值.-- (散列方法) · 这种转换是一种压 ...

  6. hash,bloomfilter,分布式一致性hash

    场景 使用word 文档时,判断某个单词是否拼写正确 垃圾邮件过滤算法 Redis缓存穿透 bitcoin core中交易校验 需求 从海量数据中查询某个字符串是否存在? 平衡二叉搜索树 增删改查时间 ...

  7. hash oracle 分表_一致性Hash算法在数据库分表中的实践

    最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...

  8. Redis 笔记(05)— hash 类型(设置获取单个hash值、判断hash键是否存在、设置获取多个hash值、获取所有hash的键、获取所有hash的值、删除hash指定键)

    Redis 的字典是无序字典.Redis 的字典的值只能是字符串,当 hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收. hash 结构也可以用来存储用户信息,不同于字符串一次性需要 ...

  9. hash地址_到底什么是Hash?

    到底什么是hash hash算法的概念 Hash: 一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通 ...

最新文章

  1. 数字图像处理:图像就是函数的解读
  2. SD-WAN是更简单的企业WAN解决方案吗?
  3. QT学习笔记(1)----- QT简介
  4. java虚拟机性能监控调优及原则
  5. 三种常用SoC片上总线的分析与比较 (Z)
  6. 我如何在20小时内为AWS ML专业课程做好准备并进行破解
  7. sybase 连接mysql_如何连接到Sybase SQL Anywhere数据库
  8. 在非托管对象中使用Spring托管Bean
  9. 数据结构(Java)——查找和排序(1)
  10. Altium Designer实现原理图到PCB板的转换
  11. 易到高管被原百度外卖CEO巩振兵逼下跪:职场人到中年的无奈
  12. Java对Json文件中数据排序_[Java教程]js之封装sort实现json格式数据的排序
  13. 网易我的世界服务器如何装组件,【图文教程】我的世界中国版怎么添加使用光影|光影放在哪里|服务器光影如何安装...
  14. Android MVP架构实现
  15. 【微信小程序中的股票分时图、K线图的源代码解析】
  16. 如何理解海森堡的「不确定性原理」?
  17. c语言printf小数乘整数,如何将小数化为整数
  18. HTML做一个节日页面【六一儿童节】纯HTML代码
  19. 51单片机实现生日快乐歌
  20. python实现ID3

热门文章

  1. mysql表collate冲突_数据库排序规则的冲突(理解collate Chinese_PRC_CI_AS)
  2. Python中的可变和不可变类型
  3. 【最全资源】关于机器学习的干货借鉴
  4. Canvas学习:绘制圆和圆弧
  5. 笔记本电脑无法连投影仪的问题
  6. traffic server文件目录
  7. 机器学习之---马尔可夫随机场实例
  8. 【建筑类】1000套住宅户型CAD图纸
  9. 软考中级软件设计师--10.操作系统
  10. Arduino跑通ssd1306_spi显示屏