hash函数

BloomFilter过滤器代码原理介绍

时间秒杀一切 提交于 2019-11-30 12:01:41
BloomFilter过滤器代码原理介绍 通过多个hash函数的使用可以减少hash冲突的出现。 package com.xdclass.mobile.xdclassmobileredis.controller; import java.util.BitSet; //传统的Bloom filter 不支持从集合中删除成员。 //Counting Bloom filter由于采用了计数,因此支持remove操作。 //基于BitSet来实现,性能上可能存在问题 public class SimpleBloomFilter { //DEFAULT_SIZE为2的25次方 private static final int DEFAULT_SIZE = 2 << 24; /* 不同哈希函数的种子,一般应取质数,seeds数据共有7个值,则代表采用7种不同的HASH算法 */ private static final int[] seeds = new int[] { 5, 7, 11, 13, 31, 37, 61 }; //BitSet实际是由“二进制位”构成的一个Vector。假如希望高效率地保存大量“开-关”信息,就应使用BitSet. //BitSet的最小长度是一个长整数(Long)的长度:64位 private BitSet bits = new BitSet(DEFAULT

新兵训练营系列课程——海量数据存储基础

Deadly 提交于 2019-11-30 10:40:15
新兵训练营系列课程——海量数据存储基础 2015年8月12日 09:24 阅读 16831 微博平台研发作为微博的底层数据及业务支撑部门,已经经历了 5 年的发展历程。伴随着从数据及业务暴发式增长,我们在海量数据存储方面遭遇了诸多挑战,与此同时也伴随着丰富经验的积累。 本次新兵训练营,受众在于应届毕业生,目的在于让新同学系统化并且有针对性的了解平台的核心技术及核心业务,以使新同学在新兵训练营结束后,能够对平台的底层架构与业务有一定的了解。 本文主要面向新同学介绍平台的核心技术之一——海量数据存储,主要介绍在海量数据存储在大规模分布式系统下的架构变迁与设计。 课程大纲: 1. 课程目标 2. 存储服务概述 3. MySQL 与 MySQL 分布式架构设计 4. Redis 与 Redis 分布式架构设计 5. 思考与讨论 一、课程目标 1. 了解存储服务概况,以及RDBMS及NoSQL的差异 2. 理解MySQL、Redis、HBase基本实现机制、特性、适用场景 3. 理解几种存储产品的大规模分布式服务方案 4. 学会使用平台的MySQL、 Redis client组件 5. 理解对于MySQL、Redis分布式系统设计想要注意的问题 6. 了解平台几种典型案例 7. 理解几种存储产品在平台的定制修改与名词术语 二、存储服务概述 1. 关系型数据库是基于 实体关系模型(Entity

前端面试题2019

泄露秘密 提交于 2019-11-30 07:17:39
1.var,let,const区别 (1)var存在变量提升,let和const不存在变量提升,所以只能在变量声明之后使用,否则会报错。 (2)const不可修改,声明时,直接初始化,var,let可修改,但是如果const指向的是一个引用值,只需要保证引用值的地址不改变即可。 (3)let和const都是块级作用域,var是函数级作用域。 (4)let,const都不允许在相同的作用域内声明同一变量。 2.事件冒泡、事件委托以及事件捕获? 事件冒泡就是子级元素的某个事件被触发,它的上级元素的该事件也被递归执行。冒泡的终点是window。 阻止事件冒泡在子级元素上面加上e.stopPropagation()阻止事件冒泡。 事件委托其实是使用了冒泡的原理,从点击的元素开始,以递归方式的向父元素传播事件,这样做的好处是对于大量要处理的元素,不必为每个元素都绑定事件,只需要在他们的父元素上绑定一次即可,提高性能。 还有一个好处就是可以处理动态插入dom中的元素,直接绑定的方式是不行的。 事件捕获是最外层的事件先被触发,最后才是我们点击的button事件被触发,这便是事件捕获。 阻止事件捕获的方式是e.stopPropagation()。 3.防抖: 理解:在车站上车,人员上满了车才发走重点是人员上满触发一次。 场景:实时搜索,拖拽。 实现: //每一次都要清空定时器,重新设置上计时器值

Java集合 HashSet的原理及常用方法

落花浮王杯 提交于 2019-11-30 03:10:42
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单 一. HashSet概述 HashSet是Java集合Set的一个实现类,Set是一个接口,其实现类除HashSet之外,还有TreeSet,并继承了Collection,HashSet集合很常用,同时也是程序员面试时经常会被问到的知识点,下面是结构图 public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable {} 二. HashSet构造 HashSet有几个重载的构造方法,我们来看一下 private transient HashMap map; //默认构造器 public HashSet() { map = new HashMap<>(); } //将传入的集合添加到HashSet的构造器 public HashSet(Collection< ? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } //明确初始容量和装载因子的构造器 public HashSet(int

深入分析HashMap

て烟熏妆下的殇ゞ 提交于 2019-11-30 01:47:28
每个学生都有学号、姓名、年龄、身高等信息,其中学号是学生的唯一标识,要把学生存储起来,并可以通过学号快速查找。 我们很自然的想到数组( 数组支持按照下标随机访问,时间复杂度O(1) ),将这些学生的信息放到数组里,但是我们又怎么通过学号从数组里查找到该学生的信息呢? 如果可以把学号映射到数组里的一个索引位置,这样我们就可以根据学号找到索引位置,进而查到学生的信息。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 散列函数 下面的hash函数用key的哈希码值对数组大小取余,来锁定数组的位置。 // 哈希函数必须把关键字的范围压缩到数组的范围,用取余操作来完成 public int hashFunc(String key) { return key.hashCode() % arraySize; // hash function } 散列冲突 如果不同的key经过hash函数,命中了数组的同一个索引位置,那怎么办? 再好的hash函数也无法避免散列冲突,常用的散列冲突解决方案有开放地址法和链地址法。 开放地址法 开放地址法的思想就是当前索引有冲突了,那么我就根据一定的规则找到其他空闲的索引位置。最简单的方式就是,每次当前索引+步长(比如1),向下查找,直到找到空闲的位置,当然也可以每次hash的时候改变步长。查找的时候也是每次当前索引+步长(比如1),向下查找,直到遇到空闲位置

Java集合必会14问(精选面试题整理)

一世执手 提交于 2019-11-30 01:07:29
前言.... 前言:把这段时间复习的关于集合类的东西整理出来,特别是HashMap相关的一些东西,之前都没有很注意1.7 ->> 1.8的变化问题,但后来发现这其实变化挺大的,而且很多整理的面试资料都没有更新(包括我之前整理的...) 1)说说常见的集合有哪些吧? 答:Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等 2)HashMap与HashTable的区别? 答: HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的; HashMap允许K/V都为null;后者K/V都不允许为null; HashMap继承自AbstractMap类;而Hashtable继承自Dictionary类; 3)HashMap的put方法的具体流程? 图引用自:https://blog.csdn.net/u011240877/article

mysql

北城以北 提交于 2019-11-29 18:36:22
索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询. 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序,原理同上. hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测.AAAA和AAAAB的索引没有相关性.

Redis五大数据类型详解

别来无恙 提交于 2019-11-29 16:44:39
关于Redis的五大数据类型,它们分别为:String、List、Hash、Set、SortSet。本文将会从它的 底层数据结构 、 常用操作命令 、一些 特点 和 实际应用 这几个方面进行解析。对于数据结构的解析,本文只会从大的方面来解析,不会介绍详细的代码实现。 String 1.实现结构   String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。首先,表面上它是字符串,但其实他可以灵活的表示 字符串、整数、浮点数 3种值。Redis会自动的识别这3种值。那么,String的底层数据机构又是怎样的呢?由于Redis是使用c语言实现的,而c语言中没有String这一数据类型,那么就需要自己实现一个类似于String的 结构体 。它的名字就叫做SDS(simple dynamic string),下面是它的代码结构。 1 typedef struct sdshdr { 2 // buf中已经占用的字符长度 3 unsigned int len; 4 // buf中剩余可用的字符长度 5 unsigned int free; 6 // 数据空间 7 char buf[]; 8 } 如果有了解过Java集合框架类的朋友都知道,这种结构与集合中 动态数组结构 类似,那么就会涉及到一系列的扩容判断和操作,但这些具体的做法在这里不深入讲解

Redis

99封情书 提交于 2019-11-29 16:17:14
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 一、Redis安装和基本使用 wget http://download.redis.io/releases/redis-3.0.6.tar.gz tar xzf redis-3.0.6.tar.gz cd redis-3.0.6 make 启动服务端 src/redis-server 启动客户端 src/redis-cli redis> set foo bar OK redis> get foo "bar" 二、Redis的特性 使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2)

python常用模块1

▼魔方 西西 提交于 2019-11-29 14:04:37
目录 time模块 datetime模块 random模块 os模块 sys模块 json模块 pickle模块 hashlib模块 hash是什么 撞库破解hash算法加密 hmac模块 logging模块 time模块 打印时间戳、格式化时间、结构化时间,总而言之就是打印不同类型的时间,进行不同类型时间的转换 import time # 时间戳 time.time() (*****) # 格式化时间 time.strftime('%Y-%m-%d %X') # 结构化时间 time.localtime() # 北京时间 time.gmtime() # 格林威治时间 time.gmtime(0) # 1970/1/1/0:00 # 时间的转换(了解中的了解) # 结构化时间转换为时间戳 now = time.localtime() time.mktime(now) # 结构化时间转格式化时间 time.strftime('%Y-%m-%d %X', now) # 2019-06-11 08:45:30 time.strftime('%Y-%m-%d', now) # 2019-06-11 # 格式化时间转结构化时间 now = time.strftime('%Y-%m-%d %X') time.strptime(now,'%Y-%m-%d %X') time.strptime(