hash函数

hash表的冲突解决方法

痞子三分冷 提交于 2020-01-25 08:22:14
前要知识:hash表有多大就要开多少个空间,记得从0开始。 1.链地址法(又称拉链法、开链法等)Separate chaining hash table 如图所示,今有若干数据,将其使用链地址法存储起来,其示意图如下,如果冲突了就把他接在别人的屁股上,真的是相当方便和简单呢。 2.开放地址法 开放地址法主要有三种方法: 线性探查法(linear probing)、 二次探查法(quadratic probing)、 双重hash(second hash或double hash) 这些都是属于开放地址法 注意对双重hash要与再hash做好区分 首先是线性探查法 这个很简单,就是一次hash后发现要插入的位置已经被别的元素占了,就往下移一个,再冲突再移呗。 默认hash规则都是 mod10. 比如依次插入: 89 18 49 58 9 接下来是平方探查法(二次探查法) 它和线性类似,不过它在遇到冲突时是按照平方来的,并且是正负依次走下去,比如:1,-1,4,-4,9,-9,形如这种。 还是: 89 18 49 58 9 比如49时冲突了(9+1)mod=0; 就插入0号位,58冲突时就正负1不行了都冲突了,就轮到2的平方也就是4 (8+4)mod10=2,所以就放入2号位 ,同理其他都是这样。 最后一个是双重hash: 这个很有它的特点

编码,加解密,签名,Hash

情到浓时终转凉″ 提交于 2020-01-24 10:14:36
工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗? 这次我想把它们统一的整理说明下: 一: 编码 编码是信息从一种形式或格式转换为另一种形式的过程,所以他们是可逆的,不能称之为加密。 下面列举几个常见的(参考 编码那些事 ): html实体编码(10进制与16进制): 如把尖括号编码[ < ] -----> html十进制: < html十六进制:< javascript的八进制跟十六进制: 如把尖括号编码[ < ] -----> js八进制:\74 js十六进制:\x3c jsunicode编码: 如把尖括号编码[ < ] ----->jsunicode:\u003c url编码 base64编码: 如把尖括号编码[ < ] -----> url: %3C base64: PA== 你可以根据他们编码后的特征来快速分辨一个看上去毫无意义的字符是由什么编码转换过来的,并试试将其转换回去,百度有一个转化工具: xss编码转换工具 如下: 编码类型 特征(以什么特征字符开头) 以“<”字符为例 html实体编码10进制 &# &#60 html实体编码16进制 &#x &#x3c javascript的八进制 \ \74 javascript的十六进制 \x \x3c jsunicode编码 \u \u003c

Redis(三):set/get 命令解析

人盡茶涼 提交于 2020-01-22 18:11:58
  经过前两篇的介绍,我们对整个redis的动作流程已经有比较清晰的认识。   接下来就是到具体的命令处理方式的理解了,想来我们用这些工具的意义也是在此。虽然没有人觉得,一个set/get方法会有难度,但是我们毕竟不是很清楚,否则也不至于在谈到深处就懵逼了。   我觉得本文的一个重要意义就是: 让set/get还原成它本来样子,和写"hello world"一样简单。 框架性质的东西,我们前面已经讲解,就直接进入主题: set/get 的操作。   set/get 对应的两个处理函数 (redisCommand) 定义是这样的: // rF 代表 getCommand 是只读命令,又快又准,时间复杂度 O(1)或者O(log(n)) // wm 代表 setCommand 是个写命令,当心空间问题 {"get",getCommand,2,"rF",0,NULL,1,1,1,0,0} {"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0}   所以,我们只要理解了, setCommand,getCommand 之后,就可以完全自信的说,set/get 就是和 "hello world" 一样简单了。 零、hash 算法   很显然,kv型的存储一定是hash相关算法的实现。那么redis中如何使用这个hash算法的呢?   redis

散列表(一).散列表基本内容介绍

耗尽温柔 提交于 2020-01-21 23:57:01
  一说到散列表,大家脑子想到的词就是:Hashmap、key-value、查找速度快、增删速度快等等。确实,在我们平常的学习生活中,散列表是很常见、也是用的很多的数据结构。那么散列表是怎样设计出来的,为什么它既可以和数组一样查询快,又可以和链表一样快增删,本节让我们一起了解一下什么是散列表、什么是散列函数、它究竟是如何设计出来的。 散列思想   什么是散列思想呢?散列表还有一个英文名叫做Hashtable,也叫做“哈希表”、“hash表”,hash我们都了解,是同过一定的算法、hash算法得到一个对象的散列值,用来标识对象本身的算法。   我们来举一个例子,假如有50个同学参加数学竞赛,为了能快速方便地找到每一个人,所以每个人都设立一个编号,从1到50,代表50个学生。现在如果我们用代码去实现这一功能的话,我们可以将这50个学生放到数组中去,从数组下标为1的位置开始,放入编号为1的学生,以此类推,将学生的编号和数组的下标一一对应,当我们要找第32个学生的时候,直接arr[32]就可以找到这个学生了,这样,就达成了O(1)的时间复杂度。实际上,这个例子已经用到了散列思想,能够快速地找到我们想找的学生,如果你觉得不够明显的话我们可以稍加改造一下。   假如,老师说编号这样太简单了,无法明显地表面这个学生的信息,需要再加上年级、班级这些信息,变成了6位数字,比如020433

HashMap源码分析(一)

社会主义新天地 提交于 2020-01-20 23:26:03
基于JDK1.7 HashMap源码分析 概述 HashMap是存放键值对的集合,数据结构如下: table被称为桶,大小(capacity)始终为2的幂,当发生扩容时,map容量扩大为两倍 HashMap采用拉链法解决Hash冲突,发生冲突时,新元素采用头插法插入到对应桶的链表中 HashMap有几个重要字段: size:HashMap键值对的数量 capacity:桶数量,即table.length,默认16 loadFactor:负载因子,度量负载程度,基于时间和空间的权衡,默认0.75 threshold:阈值,当 size>=threshold 将发生扩容, threshold=capacity * loadFactor 。 JDK1.7 源码分析 属性 /** * 默认初始容量 (必须是2的幂) */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * 最大容量 */ static final int MAXIMUM_CAPACITY = 1 << 30; /** * 默认负载因子 */ static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * 空表 */ static final Entry<?,?>[] EMPTY_TABLE = {

python3 一致性hash算法

五迷三道 提交于 2020-01-19 09:13:36
python3 一致性hash算法 量少的场景, 一致性hash不均匀的问题很难解决,加500个虚拟节点也不是很管用 算法很简单,自己用函数写了一下,仅供参考: python3代码展示: import hashlib server_ip_list = ["192.168.1.10", "192.168.2.20", "192.168.3.30","192.168.4.40"] client_ip_list = ["113.88.97.173", "106.11.154.33", "207.46.13.149","42.156.137.120", "203.208.60.0", "119.39.47.182", "171.34.179.4", "111.175.58.52", "124.235.138.199","175.184.166.184","111.175.58.52", "124.235.18.119","175.144.163.124","175.14.166.114","111.175.8.152", "124.23.18.113","175.144.13.116"] def get_md5(data): m = hashlib.md5() m.update(data.encode('utf-8')) return m.hexdigest() def get_ip():

浅谈HashMap

假如想象 提交于 2020-01-13 22:57:04
目录 浅谈HashMap 基本特性 定义 历遍 HashMap的模型 初始化 Get和Put方法 浅谈HashMap 基本特性 定义 hashMap是一个无序的,非空的容器,而且是非同步的容器会造成线程不安全的这类问题,即有许多人都想要同一份学习资料,系统会复制出多份资料后,给每个人一份资料,而不同的人对这份资料有着不同的看法并对该资料进行修改,再上传到系统中。可想而知资料会有多少个版本,但是系统只能存放一个版本的资料,因而会丢失大量版本信息。线程不安全:简单来说,就是用户读到的信息有一定可能是错误的,从而做出错误的操作(抢票时,可能抢到重票或抢到一张不存在的票) 历遍 HashMap的容量太大或太小,不利于literation(迭代器)查询目标。 HashMap的模型 HashMap是数组和单向列表的结合体,即用数组来装列表的表头,因此在做增删等操作时,所消耗的时间和空间会比数组小,查询容器的中元素的速度会比列表快。类似于下图 初始化 HashMash中常量: HashMap有4个构造函数; public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; //使用默认的加速因子,bucket 的大小为默认的16 } 1 public HashMap(int initialCapacity, float loadFactor) {

让人眼前一亮的算法------一致性Hash

杀马特。学长 韩版系。学妹 提交于 2020-01-12 02:28:00
背景 随着时代的发展,数据量与日俱增,相比纵向扩展单机的性能,人们更倾向于横向扩展,将多台一般的廉价机器组成集群来充当超级计算机,节省了大量的成本,代价是极大地增加了系统的复杂性。为了应对这些复杂性,一批又一批分布式领域的技术相继诞生,其中不乏一些看过之后令人拍案叫绝的精彩的想法。 从存储来说,数据量大的时候,一台机器不能胜任时,那么通常的做法是将数据分片,存储到多台机器上,通过集群的方式完成数据存储的需求,举个例子,你有大量的数据需要缓存,比如100G,一般的机器显然没有这么大的内存,于是不得不把这100G分布到比如10台机器上,每台存储10G的数据。数据分配的算法有很多种,一种比较容易想到的就是hash,通过将数据对10取模,hash到各个机器上。看似很美好,但是有两点因素是不得不考虑的: 组成集群的机器都是廉价的小型计算机,机器故障是在正常不过的事情了。 随着数据量的持续增加,你发现10台机器不够用了,想增加1台上去,过一段时间,又需要加一台。 以上两种情况有一个共同点:机器数量的变动。而机器数量变动之后,对数据重新取模时,会造成大量的缓存失效。举个例子: 本来10台机器,有个key是100,通过key % 10将数据均匀分布到各个机器上,这时100 % 10 = 0,这个key被分配到地0号机器上存储了,然后一台机器挂了,这时,去获取刚才存储的key,100 % 9 = 1

让人眼前一亮的算法------布隆过滤器

≯℡__Kan透↙ 提交于 2020-01-11 02:07:58
问题 假设你现在要处理这样一个问题,你有一个网站并且拥有很多访客,每当有用户访问时,你想知道这个ip是不是第一次访问你的网站。这是一个很常见的场景,为了完成这个功能,你很容易就会想到下面这个解决方案: 把访客的ip存进一个hash表中,每当有新的访客到来时,先检查哈希表中是否有改访客的ip,如果有则说明该访客在黑名单中。你还知道,hash表的存取时间复杂度都是O(1),效率很高,因此你对你的方案很是满意。 然后我们假设你的网站已经被1亿个用户访问过,每个ip的长度是15,那么你一共需要15 * 100000000 = 1500000000Bytes = 1.4G,这还没考虑hash冲突的问题(hash表中的槽位越多,越浪费空间,槽位越少,效率越低)。 于是聪明的你稍一思考,又想到可以把ip转换成无符号的int型值来存储,这样一个ip只需要占用4个字节就行了,这时1亿个ip占用的空间是4 * 100000000 = 400000000Bytes = 380M,空间消耗降低了很多。 那还有没有在不影响存取效率的前提下更加节省空间的办法呢? BitSet 32位无符号int型能表示的最大值是4294967295,所有的ip都在这个范围内,我们可以用一个bit位来表示某个ip是否出现过,如果出现过,就把代表该ip的bit位置为1

Mycat 核心配置详解

泪湿孤枕 提交于 2020-01-10 14:57:59
先上官方文档: Mycat-doc Mycat 权威指南 常用配置文件间的关系 由上图可以看到 Mycat 的核心配置文件均采用xml格式,这几个配置文件的用途如下: server.xml :用于配置系统参数、用户信息、访问权限及SQL防火墙和SQL拦截功能等 schema.xml :用于配置逻辑库、逻辑表相关信息 rule.xml :如果使用了水平切分,就需要使用该文件配置切分规则 log4j2.xml :Mycat日志相关的配置,例如日志输出格式、日志级别等 应用连接Mycat服务时,Mycat首先会通过 server.xml 中的配置信息进行用户认证。用户通过验证后,所看到的逻辑库、逻辑表都是 schema.xml 中所配置的。当使用了水平切分时,Mycat会通过 rule.xml 里配置的规则来定位具体的物理数据库位置,从而完成写入/读取数据。 server.xml 配置详解 1、 system 标签 用于配置 Mycat 的系统参数,其格式如下: <system> <!-- ${key}表示配置属性的名称,${value}表示该配置属性的值 --> <property name="${key}">${value}</property> </system> 配置 Mycat 服务端口示例: <system> <property name="serverPort">3306<