hash函数

HashMap

时光总嘲笑我的痴心妄想 提交于 2019-12-01 08:09:14
HashMap实现了Map接口,并继承 AbstractMap 抽象类,其中 Map 接口定义了键值映射规则。AbstractMap 抽象类提供了 Map 接口的骨干实现,以最大限度地减少实现Map接口所需的工作。 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{ ... } 初始容量 和 负载因子,这两个参数是影响HashMap性能的重要参数。其中,容量表示哈希表中桶的数量 (table 数组的大小),初始容量是创建哈希表时桶的数量;负载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。 哈希的相关概念    Hash 就是把任意长度的输入(又叫做预映射, pre-image),通过哈希算法,变换成固定长度的输出(通常是整型),该输出就是哈希值。 这种转换是一种 压缩映射 ,也就是说,散列值的空间通常远小于输入的空间。不同的输入可能会散列成相同的输出,从而不可能从散列值来唯一的确定输入值。简单的说,就是一种将任意长度的消息压缩到某一固定长度的息摘要函数。 1 /** 2 * Constructs an empty HashMap with the

初学Redis(2)——用Redis作为Mysql数据库的缓存

送分小仙女□ 提交于 2019-12-01 08:01:49
用Redis作Mysql数据库缓存,必须解决2个问题。首先,应该确定用何种数据结构存储来自Mysql的数据;在确定数据结构之后,还要考虑用什么标识作为该数据结构的键。 直观上看,Mysql中的数据都是按表存储的;更微观地看,这些表都是按行存储的。每执行一次select查询,Mysql都会返回一个结果集,这个结果集由若干行组成。所以,一个自然而然的想法就是在Redis中找到一种对应于Mysql行的数据结构。Redis中提供了五种基本数据结构,即字符串(string)、列表(list)、哈希(hash)、集合(set)和有序集合(sorted set)。经过调研,发现适合存储行的数据结构有两种,即string和hash。 要把Mysql的行数据存入string,首先需要对行数据进行格式化。事实上,结果集的每一行都可以看做若干由字段名和其对应值组成的键值对集合。这种键值对结构很容易让我们想起Json格式。因此,这里选用Json格式作为结果集每一行的格式化模板。根据这一想法,我们可以实现将结果集格式化为若干Json对象,并将Json对象转化为字符串存入Redis的代码: [cpp] view plain copy // 该函数把结果集中的每一行转换为一个Json格式的字符串并存入Redis的STRING结构中, // STRING键应该包含结果集标识符和STRING编号,形式如“cache

HashMap了解吗?

怎甘沉沦 提交于 2019-12-01 07:23:15
HashCode() HashMap 底层实现 HashMap 的长度为什么默认初始长度是16,并且每次resize()的时候,长度必须是2的幂次方? HashMap 死链问题 Java 8 与 Java 7对比 为什么要使用红黑树? 说说hashmap如何处理碰撞的,或者说说它的扩容?   一,简介 (1)桶(capacity)容量,即数组长度:DEFAULT_INITIAL_CAPACITY=1<<4;默认值为16,即在不提供有参构造的时候,声明的hashmap的桶容量; (2)MAXIMUM_CAPACITY = 1 << 30;   极限容量,表示hashmap能承受的最大桶容量为2的30次方,超过这个容量将不再扩容,让hash碰撞起来吧! (3)static final float DEFAULT_LOAD_FACTOR = 0.75f;   负载因子(loadfactor,默认0.75),负载因子有个奇特的效果,表示当当前容量大于(size/)时,将进行hashmap的扩容,扩容一般为扩容为原来的两倍。 (4)int threshold;阈值(yu)   阈值算法为capacity*loadfactory,大致当map中entry数量大于此阈值时进行扩容(1.8) (5)transient Entry<K,V>[] table = (Entry<K,V>[])

PHP匿名函数及闭包

╄→尐↘猪︶ㄣ 提交于 2019-12-01 06:08:23
匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数,C++的新标准C++0x也开始支持了。 匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数,最常见应用是作为回调函数。 闭包(Closure) 说 到匿名函数,就不得不提到闭包了,闭包是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数,这个被应用的自由变量将和这个函数一同存在,即使离开了创建它的环境也一样,所以闭包也可认为是有函数 和与其相关引用组合而成的实体。在一些语言中,在函数内定义另一个函数的时候,如果内部函数引用到外部函数的变量,则可能产生闭包。在运行外部函数时,一 个闭包就形成了。 这个词和匿名函数很容易被混用,其实这是两个不同的概念,这可能是因为很多语言实现匿名函数的时候允许形成闭包。 使用create_function()创建"匿名"函数 前面提到PHP5.3中才才开始正式支持匿名函数,说到这里可能会有细心读者有意见了,因为有个函数是可以生成匿名函数的: create_function函数,在手册里可以查到这个函数在PHP4.1和PHP5中就有了,这个函数通常也能作为匿名回调函数使用,例如如下: <?php

hashCode及HashMap中的hash()函数

夙愿已清 提交于 2019-12-01 05:42:16
hashCode及HashMap中的hash()函数 一、hashcode是什么 要理解hashcode首先要理解hash表这个概念 1. 哈希表 hash表也称散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 简单理解就是:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。 具有快速查找和插入操作的优点 2. hashcode hashcode 通过hash函数计算得到,hashcode就是在hash表中有对应的位置 每个对象都有hashcode,通过将对象的物理地址转换为一个整数,将整数通过hash计算就可以得到hashcode 二、hashcode的作用 HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的 对于容器类设计 基本上都会涉及到hashCode。在Java中也一样

redis源码分析3---结构体---字典

被刻印的时光 ゝ 提交于 2019-12-01 03:23:28
redis源码分析3---结构体---字典 字典,简单来说就是一种用于保存键值对的抽象数据结构; 注意,字典中每个键都是独一无二的;在redis中,内部的redis的数据库就是使用字典作为底层实现的; 1 字典的实现 在redis中,字典是使用哈希表作为底层实现的,一个hash表里面可以有多个hash表节点,而每个hash表节点就保存了字典中的一个键值对; hash表定义 table属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值对; 一个空的hash表: hash表节点 key保存键值对中的键,v为值,union表示三个钟选择一个,next是指向另一个hash表节点的指针,这个指针可以将多个hash值相同的键值对连接在一起,以此来解决冲突的问题; 比如 字典结构 总的来说,没有rehash的字节结构图如下 2 hash算法 当要将一个新的键值对添加到字典里面时,程序需要先根据键值对的键计算出hash值和索引值,然后再根据索引值,将包含新建支队的hash表节点放到哈市表数组的制定索引上面。 3 解决冲突 在hash表中不可避免的会出现冲突,当有两个或者两个以上的键被分配到了hash表数组的同一个索引上面时,就说发生了冲突; 在redis中使用链地址法来解决键冲突;就是我们在前面的结构中定义的next指针实现的; 4

一致性Hash算法

老子叫甜甜 提交于 2019-12-01 02:50:51
本文章比较好的说明了一致性Hash算法的概念 Hash算法一般分为除模求余和一致性Hash 1、 除模求余:当新增、删除机器时会导致大量key的移动 2、一致性Hash:当新增、删除机器时只会影响到附近的key,因为是环状结构 转载请说明出处: http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。 2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。 3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲

ProtoBuf 源码简析

て烟熏妆下的殇ゞ 提交于 2019-12-01 02:07:04
ProtoBuf项目描述:   Google Protocol Buffer简称protobuf,为高效的二进制序列化/反序列化协议(一般为google内部使用),不同于xml、json等,其更小巧、高效;avro、thrift等; 其可用于网络协议、数据存储等语言无关、平台无关、可扩展的序列化结构数据格式。只要按照特定条件可支持向前、向后兼容;目前提供了C++、Java、Python 三种语言的 API,这样各语言可以相互序列化和反序列化数据信息(事实上也可以自定义实现其他语言的API接口)。 在使用中,用户可根据自定义或引入数据结构(Message)文件*.proto;此后通过编译器protoc.exe编译该描述文件为指定语言的操作接口,而后将产生的操作接口文件 和libprotobuf.lib添加入项目中进行数据序列化和反序列化操作即可,产生的序列化后的信息可读性很差,此外反序列化也必须知道对应的数据结构描述文件*.proto, 否则无法正确地反序列化,也不再有意义,相对xml,json无法直接插入或修改数据信息内容; 以下仅对C++相关进行分析; 项目工程: gtest:google 白盒测试开源项目,主要用于单元测试,后面的gtest_main、tests项目; gtest_main:简单的对main函数以及testing::InitGoogleTest(&argc,

五.内置函数和匿名函数

梦想与她 提交于 2019-11-30 13:51:48
楔子 在讲新知识之前,我们先来复习复习函数的基础知识。 问:函数怎么调用? 函数名() 如果你们这么说。。。那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题。。。 来你们在自己的环境里打印一下自己的名字。 你们是怎么打的呀? 是不是print('xxx'),好了,现在你们结合我刚刚说的函数的调用方法,你有没有什么发现? 我们就猜,print有没有可能是一个函数? 但是没有人实现它啊。。。它怎么就能用了呢? 早在我们“初识函数”的时候是不是就是用len()引出的? 那现在我们也知道len()也是一个函数,也没人实现,它好像就自己能用了。。。 之前老师给你讲你可以这样用你就用了,那你有没有想过像这样直接拿来就能用的函数到底有多少? 返回顶部 内置函数 接下来,我们就一起来看看python里的内置函数。截止到python版本3.6.2,现在python一共为我们提供了 68个内置函数 。它们就是python提供给你直接可以拿来使用的所有函数。这些函数有些我们已经用过了,有些我们还没用到过,还有一些是被封印了,必须等我们学了新知识才能解开封印的。那今天我们就一起来认识一下python的内置函数。这么多函数,我们该从何学起呢? Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next

ORACLE表、索引和分区

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-30 13:44:14
ORACLE 表、索引和分区 一、数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 • 堆组织表 • 聚簇表 ( 共三种 ) • 索引组织表 • 嵌套表 • 临时表 • 外部表和对象表 1. 行迁移 • 建表过程中可以指定以下两个参数: • PCTFREE :自由空间,默认值 10 • PCTUSED (只适用于 MSSM ):默认值 40 • 设置这两个参数很重要: • 一方面避免迁移过多的行,影响性能 • 一方面避免浪费太多的空间 • 当自由空间存不下更新后的某一行时,这一行将会发生行迁移,在两个块上存储这一行数据,如下图: 2. 堆组织表 • 基本上我们使用的表都是堆组织表( heap organized table ),堆是无序的数据结构,数据的存取都是随机的,想要排序必须使用 order by 子句 • 对于 ASSM 有三个重要的选项: • PCTFREE • INITRANS :默认值 2 ,高并发会设置更大一些 • COMPRESS/NOCOMPRESS :启用 / 禁用压缩 3. 索引组织表( IOT ) • 以索引结构存储的表 • 使用场景: • 信息检索 • 空间数据 • OLAP 应用 • 创建,使用 organization index 子句: create table tbl( name varchar2(20), age int )