为什么Hashtab的大小通常取远离2^n 的素数
举个栗子
在Hashtab中我们通常 Hash(key) % M 来确定 key 所需要存放的位置
M就是Hashtab的大小,假设下面的两个场景
Hash(key1) = 108
Hash(key2) = 500
如果 M 恰好是 2^n,我们在这里假设M为2^3=8
则
Hash(key1) % M = 108 % 8 = 4
Hash(key2) % M = 500% 8 = 4
此时最后的结果只会在 [000,111]
也就是 0-7之间 ( 这个111指的是二进制)
因为任何的数表示成二进制,然后和另一个2^n取余,二进制串中大于n位的就会被消掉
eg : 108 : 1101100 8 : 1000 500 111110100
108 % 8 = 1101100 % 1000 = 1101 100 注意: 只与最后三位有关系,其余的在余的过程会被消除。
500也是同理,这样就大大增加了Hash冲突的概率。
但是如果是一个素数的话,并且最好远离2^n的话,情况就不同了。
108 % 53 = 2
500 % 53 = 23
明显好了许多。
STL HashTab中用的素数表就是 : http://planetmath.org/goodhashtableprimes
为什么Hashtab的大小通常取远离2^n 的素数的更多相关文章
- [知识笔记]Java 基本数据类型的大小、取值范围、默认值
数据类型 大小(字节) 范围 默认值 boolean 1/8(1bit) true/false false byte 1 -128~127 (-2^7~2^7-1) 0 short 2 -32768~ ...
- C语言各数据类型大小和取值范围
- 海思板卡SATA最佳读写块大小测试
1 引言 应需求,在海思板子上测试SATA读写速度,用dd指令,每次分别读/写不同大小的块 (bs),同时检测运行dd命令CPU占比,记录读/写速度和CPU占比. 2 实验过程 2. ...
- 深入理解移动web开发之PPI,Pixel,DevicePixelRatio(转)
如果你是一个开始接触移动Web开发的前端工程师,那么你或许也遇到了和我曾经遇到的过问题:有太多新的概念需要掌握,太多相似的概念需要区分.没关系,我将用两篇文章的篇幅来解决这些问题.上篇文章关于解释和区 ...
- 浅谈移动Web开发(上):深入概念
PPI 什么是PPI PPI的复杂之处在于如果他所属的上下文环境不同,意义也会完全不一样. 当我们在谈论显示设备的PPI时,它代指的屏幕的像素密度:当我们在谈论和图片相关时,我们谈论的是打印时的分辨率 ...
- 相机标定问题-Matlab & Py-Opencv
一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op 坐标表示方法(u,v) Unit:Dots(个) 成像坐标系:Oi ...
- 沉淀再出发:java中的HashMap、ConcurrentHashMap和Hashtable的认识
沉淀再出发:java中的HashMap.ConcurrentHashMap和Hashtable的认识 一.前言 很多知识在学习或者使用了之后总是会忘记的,但是如果把这些只是背后的原理理解了,并且记忆下 ...
- 硬件开发之pcb---PCB抗干扰设计原则
一 电源线布置: 1.电源线.地线的走向应与资料的传递方向一致. 二 地线布置: 1.数字地与模拟地分开. 2.接地线应尽量加粗,致少能通过3倍于印制板上的允许电流,一般应达2~3mm. 3.接地线应 ...
- Unity 渲染教程(四):第一个光源
将法线从物体空间转换到世界空间. 使用方向光. 计算漫反射和镜面高光反射. 实现能量守恒. 使用金属的工作流程. 利用Unity的基于物理规则渲染的算法. 这是关于渲染基础的系列教程的第四部分.前面的 ...
随机推荐
- flask_sqlalchemy 查询结果转dict 终极解决方案
之前为了学习Python,试着拿Flask作框架搞小网站,感觉还不错,基本就抛弃了PHP.前段时间做了一个微信小程序,想着yii框架拿来写几十个小接口是不是浪费了,就继续用flask写api了,哪想到 ...
- hadoop生态之面试题篇
一.hdfs的高可用 1.先说下自己的理解, 正常的hdfs有namenode,datanode,secondnamenode,但是second name node 不是真正意义上的namenode备 ...
- Hive——安装以及概述
一.hive的安装 注意:安装hive的前提要安装好MySQL和Hadoop Hadoop安装:https://www.cnblogs.com/lmandcc/p/15306163.html MySQ ...
- unittest基本原理及介绍
unittest基本原理: unittest是python自带的测试框架,还有一个框架是:pytest,这里简单介绍下unittest模块的简单应用 unittest是python的标准测试库,相比于 ...
- Go变量与基础数据类型
一.基础介绍 Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算) 例如 python 就是动态强类型语言 1.Go 的特性: 跨平台的编译型语 ...
- Kubernetes-Service介绍(一)-基本概念
前言 本篇是Kubernetes第八篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战.Pod篇暂时应该还缺少两篇,等Service和存储相关内容介绍以后,补充剩下的两篇,有状态的Pod会涉及 ...
- js 手动实现 promise.all的功能
在中高级面试中,实现一个promise.all是一个频率较高的面试题 首先分析下 promise.all(),(参考MDN) 接收一个promise的iterable类型(注:Array,Map,Se ...
- 学校选址(ArcPy实现)
一.背景 合理的学校空间位置布局,有利于学生的上课与生活.学校的选址问题需要考虑地理位置.学生娱乐场所配套.与现有学校的距离间隔等因素,从总体上把握这些因素能够确定出适宜性比较好的学校选址区. 二.目 ...
- FastAPI 学习之路(十)请求体的字段
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- Vue Router 常见问题(push报错、push重复路由刷新)
Vue Router 常见问题 用于记录工作遇到的Vue Router bug及常用方案 router.push报错,Avoided redundant navigation to current l ...