哈希

JDK7-HashMap源码解析

こ雲淡風輕ζ 提交于 2019-12-22 00:25:32
为了方便阅读和写注释,笔者将HashMap源码单独拷出来了,推荐大家也这么做,阅读起来更加轻松,Debug也很方便,更重要的是,你可以修改源码来测试。 继承关系图 阅读源码建议采用自上而下的结构,建议先看Map接口、然后AbstractMap抽象类、最后HashMap。 整体结构分层 Map接口 定义Map具备的功能,使用内部接口Entry来对单个映射关系进行封装,Entry是Map的基本组成单元。 AbstractMap 实现了Map接口的抽象类,实现了绝大多数方法,put和entrySet没有实现,因为这两个方法涉及到底层的实现逻辑和数据结构,必须交给子类去实现。 HashMap 继承自AbstractMap,实现了Map。 实现了自己的Entry,除了保存映射关系外,因为是基于哈希的,所以还记录了哈希值,因为采用的链表结构,所以用next记录了下一个节点的地址。 HashMap解析 笔者几乎给每个属性和方法都写上了注释,想要源码的朋友可以私信我。 各属性的含义 /** * 默认容量:1<<4 = 10000 = 16 * 必须是2的幂次方数 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4 ; /** * 最大容量:1<<30 = 1000000000000000000000000000000 = 1073741824

内存中OLTP与内存不足

放肆的年华 提交于 2019-12-20 23:41:29
我已经写了好几次内存中OLTP的文章和”为什么我还不推荐内存中OLTP给用户”。今天我想进一步谈下内存中OLTP背后的内存需求,还有如果你内存不够的话会发生什么。 一切都与内存有关! 我们都知道很久之前有个名人说过对于任何人,640K的内存应该足够了。他错了!对于内存中OLTP,内存需求非常高: 哈希索引的每个哈希桶由64位长的指针组成 每次你修改/删除一条记录,新版本的写入在内存中存储。 微软建议内存至少是你内存优化表的2倍。当你修改或删除记录时,这个两倍数量的空间是用做可能的行版本存储。 几个星期前,有人问我一个非常有趣的问题:当你没有足够的内存,在数据库启动期间内存中OLTP不能重建哈希索引会发生什么?这哥听起来像非常简单的问题,但在这个特定场景里知道内存中OLTP如何反应非常重要。 假设你在虚拟机里运行内存中OLTP,在某个时候你的虚拟机管理员给你的虚拟机比之前更少的内存。在虚拟化结合中,我经常看到这个。 让我们玩坏内存中OLTP! 我们来模拟这样的情景。在第一步,我想向你展示下,当你创建了内存优化表,你没有足够的可用物理内存,会发生什么。下列代码创建有4个哈希索引的新的内存优化表,每个哈希索引包含250百万的哈希桶。因此对这个整个表需要近7.4GB的内存,但我运行的虚拟机只有8G的内存。 -- 250 000 000 x 4 = 1 000 000 000 Hash

使用哈希加盐法来为密码加密(补充JAVA的实现)

南楼画角 提交于 2019-12-20 03:23:04
使用哈希加盐法来为密码加密 转自:http://www.cnblogs.com/jfzhu/p/4023439.html 转载请注明出处 (一)为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。 解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function)。哈希函数的具体定义,大家可以在网上或者相关书籍中查阅到,简单地说,它的特性如下: (1)原始密码经哈希函数计算后得到一个哈希值 (2)改变原始密码,哈希函数计算出的哈希值也会相应改变 (3) 同样的密码,哈希值也是相同的 (4) 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少 有了哈希函数,我们就可以将密码的哈希值存储进数据库。用户登录网站的时候,我们可以检验用户输入密码的哈希值是否与数据库中的哈希值相同。 由于哈希函数是不可逆的,即使有人打开了数据库,也无法看到用户的密码是多少。 那么存储经过哈希函数加密后的密码是否就是安全的了呢?我们先来看一下几种常见的破解密码的方法。 (二)几种常见的破解密码的方法 最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force

哈希Hash定义

醉酒当歌 提交于 2019-12-20 00:10:26
Hash,一般翻译做"散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系 MD5就可以说是目前应用最广泛的Hash算法 Hash算法在信息安全方面的应用主要体现在以下的3个方面: 1) 文件校验 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。 2) 数字签名 Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要

强命名程序集,签名,延迟签名

こ雲淡風輕ζ 提交于 2019-12-19 02:28:21
强命名程序集 如果一个程序集有一个唯一的标记,那么这个程序集就可以叫做强命名程序集。在.NET框架中是通过公钥/私钥加密来产生这个唯一标记的。一个强命名程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(如果有的话),公有秘钥。 这些信息存储在程序集的清单(manifest)中。清单包含了程序集的元数据,并嵌入在程序集的某个文件中。下面的字符串标识了二个不同的程序集文件: “MyType, Version=1.0.1.0,Culture=neutral, PublicKeyToken=bf5779af662fc055” “MyType, Version=1.0.1.0,Culture=en-us, PublicKeyToken=bf5779af662fc055” 弱命名程序集 其实根本就没有弱命名程序集这个名称,只是为了和强命名程序集对应而产生的一个概念。弱命名程序集就是没有一个唯一标记的程序集,其实强程序集和弱程序集的结构是一模一样的,就是一个有唯一的标识符,而后者没有。它们之间的一个区别就是,强命名程序集有一个发布者的公钥/私钥签名对,它们可以唯一的标识程序集的发布者 强命名的好处 因为强命名程序集使用公钥/私钥对来进行唯一性签名,不同的公司公钥/私钥对不可能相同,所以所生成的程序也不相同,这就解决了以前老出现的DLL Hell问题

redis-cluster

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-19 01:02:21
为什么要用redis-cluster 1.并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令假如业务需要每秒100万的命令执行呢? 2.数据量太大 一台服务器内存正常是16~256G,假如你的业务需要500G内存, 新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集群功能,核心思想都是将数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例。 各大企业集群方案: twemproxy由Twitter开源 Codis由豌豆荚开发,基于GO和C开发 redis-cluster官方3.0版本后的集群方案 解决方案如下 配置一个超级牛逼的计算机,超大内存,超强cpu,但是问题是。。。。 2.正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力, 一堆机器做一件事 客户端分片 redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。 redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上 数据分布原理图 数据分布理论

java集合常见问题

别等时光非礼了梦想. 提交于 2019-12-19 00:09:29
Java集合 常见的集合问题 HashMap与HashTable的区别 HashMap的put方法的具体流程? HashMap 解决哈希冲突 什么是哈希? 什么是哈希冲突? HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标? HashMap在JDK1.7和JDK1.8中有哪些不同? 为什么HashMap中String、Integer这样的包装类适合作为K? ConcurrentHashMap和Hashtable的区别? Java集合的快速失败机制 “fail-fast” ArrayList 和 Vector 的区别? ArrayList和LinkedList的区别? Array 和 ArrayList 有什么区别?什么时候该应 Array 而不是 ArrayList 呢? HashSet是如何保证数据不可重复的? BlockingQueue是什么? 转自 https://zhuanlan.zhihu.com/p/82714518 常见的集合问题 Map 接口和 Collection 接口是所有集合框架的父接口: Collection 接口的子接口包括: Set 接口和 List 接口 Map 接口的实现类主要有: HashMap 、 TreeMap 、 Hashtable 、 ConcurrentHashMap 以及 Properties 等

python——魔术方法

北城余情 提交于 2019-12-18 21:38:50
一、常用魔术方法 1.del 销毁魔术方法 触发时机:当一个对象在内存中被销毁的时候自动执行 参数:至少有一个self,接收对象 返回值:无 作用:在对象销毁的时候做一些操作 注意:程序自动调用此方法,不需要我们手动调用。 class Cat: def __init__(self,name): self.name=name print("{}来了".format(self.name)) #对象在销毁时执行 def __del__(self): print("{}走了".format(self.name)) cat=Cat("tom") # del cat print("程序结束")`` 结果: tom来了 程序结束 tom走了 2.call call():可以让类的实例具有类似于函数的行为, 进一步模糊了函数和对象之间的概念。 使用方式: 对象后面加括号,触发执行。 即:对象() 或者 类()() class Person : def __init__ ( self ) : pass def eat ( self ) : print ( "吃。。。" ) def __call__ ( self , num ) : he = 0 for i in range ( 1 , num + 1 ) : he += i print ( he ) person = Person ( )

浅谈增量式爬虫

你。 提交于 2019-12-18 15:19:25
引入 在我们爬取某些网站时会遇到一些问题?某些网站会定时在原有网页数据的基础上更新一批数据。 例如某电影网站会实时更新一批最近热门的电影。小说网站会根据作者创作的进度实时更新最新的章节数据等等。 那么遇到类似的场景,我们就可以采用增量式爬虫了 而增量式爬虫分为两个步骤: 增量爬取 爬取结果去重 增量爬取 一个站点更新也会出现下面两种情况: 1,单个页面数据更新 当出现这种情况的时候,我们对此特定页面的内容做哈希,当然要去除动态变化的那一部分,比如有的页面有验证码或者日期,程序定期执行,在执行的最开始检测此页面的哈希值跟上次抓取是否有变化,如果有变化就开始抓取。 2,新增了页面 如果是新增页面呢,我们会对页面入口内容做哈希,并且存储分页面的URL哈希值,如果页面入口哈希值发生变化,获取新增的页面url列表,在这里需要用到url的去重,和数据去重类似,采用redis集合类型处理。 redis集合类型不允许添加重复的数据,当添加重复的时候时,返回0,并且添加失败。我们将所有的url list存入redis集合,当页面入口变化时,进行页面url去重,只抓取新增的页面。 爬取结果去重 结果去重也有以下两种常用的方法: 布隆过滤器 其中布隆过滤器是通过写文件的方式,多个进程使用需要添加同步和互斥,较为繁琐,不推荐多线程/进程的时候使用,另外写文件是磁盘I/O操作,耗费时间长