哈希

HashMap源码分析

吃可爱长大的小学妹 提交于 2019-11-27 02:36:50
HashMap概述(非线程安全) HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 线程安全的HashMap: 方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现。 方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进。 JDK1.8中HashMap的数据结构 在 Java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的 数据结构 都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结构,但是在jdk1.8里 加入了红黑树的实现,当链表的长度大于8时,转换为红黑树的结构(之前是由负载因子实现存储的,通过红黑树结构存储这点性能是非常好的)。 JDK1.8中HashMap采用了链地址法,链地址法,就是数组加链表的结合。在数组元素上都有一个链表结构,当数据被Hash后,得到准确的数组下标

哈希算法

烈酒焚心 提交于 2019-11-26 20:25:58
最近参加了集训,学了很多新的算法。所以8月20号左右会开始写博客( 才不是因为接下来几天要出去旅行 ) 今天学习了字符串。大概学习了:哈希(Hash),KMP,Trie树,Trie图,AC自动机,后缀数组……(其实后面几个没太听懂……) 准备着先写写模板。但是发现:哈希网上的模板大多数都是对于一整个字符串make_hash。 那哈希的一个很大的优点—— 在 𝑂(1) 的时间内求出字符串的任意一个子串的哈希值 ,不就很不方便了吗? 所以自己苦思冥想( 大量翻阅其他的文献 )加上询问巨佬队友,总算写出了 类似于前缀和的哈希!! (不过后来发现网上也有…… %%% ) 对于字符串 S,我们常用的哈希方式是将它转化为一个整数: 𝑟𝑒𝑠=𝑆[1]∗𝑥 n-1 +…+𝑆[𝑛] (我比较喜欢字符数组下标从1开始) 其中 x 是我们选取的一个底数(一般 res 需要对一个质数取模)。 至于自然溢出。。。现在已经构造出能够卡掉所有哈希底数的自然溢出的字符串了 (他死了) 。 而重点来了: 在一般做题时,我们会设 f[i] 表示前缀 i 的哈希值。 这样就能让我们在 𝑂(1) 的时间内求出字符串的任意一个子串的哈希值(要先预处理了底数的幂)      𝑓[𝑙…𝑟]=𝑓[𝑟]−𝑓[𝑙−1]∗𝑥^(𝑟−𝑙+1)。 哈希算法真的非常优秀,常见用法: 1、由于哈希算法非常玄学,OI

PHP MD5常见漏洞

旧城冷巷雨未停 提交于 2019-11-26 19:58:51
1.数字与字符串之间的比较 var_dump ( 0 == "a" ) ; var_dump ( "0" == "a" ) ; 第一个返回的是 true ,第二个返回的是 false 因为php把字母开头的转化为整型时,转化为0, 前面数字后面字母的话就只取到第一个字母出现的位置之前(如intval(’'123abd45gf)结果为123) 2.MD5函数漏洞 $_GET [ 'name' ] != $_GET [ 'password' ] MD5 ( $_GET [ 'name' ] ) == MD5 ( $_GET [ 'password' ] ) 要求满足上述条件则 那么要求name和password数值不同但是MD5相同,在这里可以利用绕过。 PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。 以下值在md5加密后以0E开头: QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a 以下值在sha1加密后以0E开头: sha1(‘aaroZmOk’) sha1(‘aaK1STfY’) sha1(‘aaO8zKZF’) sha1(‘aa3OFF9m’) GET传入 a

页面置换算法之LRU缓存机制

不羁的心 提交于 2019-11-26 19:36:29
LRU缓存机制 LRU是页面置换算法的其中一个,是一种最近最少使用的缓存机制,它支持以下操作 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 我们使用O(1)的时间复杂度完成这两种操作 LRUCache cache = new LRUCache( 2 /* 缓存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 该操作会使得密钥 2 作废 cache.get(2); // 返回 -1 (未找到) cache.put(4, 4); // 该操作会使得密钥 1 作废 cache.get(1); // 返回 -1 (未找到) cache.get(3); // 返回 3 cache.get(4); // 返回 4 思路: 使用两个数据结构,一个是队列,一个是哈希map 确保通过队列的结点可以找到哈希map,通过哈希map也可以找到队列的结点,我们这样定义 //pair 中的first和second我叫做 key 和value list<

python hash 哈希值

て烟熏妆下的殇ゞ 提交于 2019-11-26 17:28:52
自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str、元组tuple、对象集objects)。   哈希有啥作用? 它是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以用在固定的时间复杂度下查询它,所以,哈希对高效的算法和数据结构很重要。 什么是不可哈希(unhashable)? 同理,不可哈希的数据类型,即可变的数据结构 (字典dict,列表list,集合set) hash(object) hash() 用于获取取一个对象(字符串或者数值等)的哈希值。返回对象的哈希值。 Hash算法(含python实现) 简介 哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。 这种散列变换是一种单向运算,具有不可逆性即不能根据散列值还原出输入信息,因此严格意义上讲Hash算法是一种消息摘要算法,不是一种加密算法。常见的hash算法有:SM3、MD5、SHA-1等 。 应用 Hash主要应用在数据结构以及密码学领域。 在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的快速性,并且要保证hash均匀分布;而应用在密码学中就要优先考虑抗碰撞性,避免出现两段不同明文hash值相同的情况发生。 2.1

HashMap、HashTable、ConcurrentHashMap

与世无争的帅哥 提交于 2019-11-26 16:34:45
HashTable :底层数组+链表,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化,初始化size为11,扩容后oldSize*2+1,计算index方法是index=(hash & 0x7FFFFFFF) %tab.length HashMap:底层数组+链表实现,可以存储null键和null值,线程不安全。初始zise为16,扩容newsize=oldsize*2,size一定是2的n次幂。扩容针对整个Map,每次扩容时,原来数组的元素一次重新计算存放位置,并重新插入,插入元素才判断要不要扩容,有可能扩容无效(插入后扩容,如果没有再次插入,就会产生无效扩容),当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀,index计算方法:index=hash &(tab.length-1) HashMap的初始值还要考虑加载因子: 哈希冲突:若干key的哈希值数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对key的查找需要遍历每个Entry链上的元素执行equals()比较。 加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,就会触发扩容,因此如果预估容量是100

并发容器ConcurrentHashMap

£可爱£侵袭症+ 提交于 2019-11-26 12:25:34
ConcurrentHashMap Hashmap多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。 HashTable使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮询状态。如线程1使用put进行元素添加,线程2不但不能使用put方法添加元素,也不能使用get方法来获取元素,所以竞争越激烈效率越低。 putIfAbsent() :没有这个值则放入map,有这个值则返回key本来对应的值。 Hash 散列,哈希:把任意长度的输入通过一种算法(散列),变换成为固定长度的输出,这个输出值就是散列值。属于压缩映射,容易产生哈希冲突。Hash算法有直接取余法等。 产生哈希冲突时解决办法:开放寻址;2、再散列;3、链地址法(相同hash值的元素用链表串起来)。 ConcurrentHashMap在发生hash冲突时采用了链地址法。 md4,md5,sha-hash算法也属于hash算法,又称摘要算法。 位运算 int 类型的位 高位 低位 ConcurrentHashMap

什么是区块链

筅森魡賤 提交于 2019-11-26 12:09:36
什么是区块链 区块链简介 什么是区块链?目前没有看到很好的定义和介绍,网上要么是讲一些区块链意义的空泛文章,比如“区块链技术颠覆谁谁谁”、又或“互联网已颠覆世界,区块链要颠覆互联网等等”,要么就是通篇介绍比特币,矿工,挖矿等。那么区块链到底是个什么东西?它跟比特币又有什么关系呢? 其实区块链本质上是一个去中心化的分布式账本数据库。其本身是一串使用密码学相关联所产生的数据块,每一个数据块中包含了多次交易有效确认的信息。而比特币就是基于区块链技术的一个应用。 这里先抛出几个问题: 1、什么叫去中心化的分布式数据库? 2、数据区块里都有什么? 3、如何利用密码学保证区块里数据不会被篡改? 4、数据是不断增加的,怎么保证新增的数据被其他节点认可? 中心化与去中心化 先看一个中心化与分布式案例,搞IT编程的都知道,目前版本控制软件最流行的一个是svn,一个是git那它俩有什么区别呢,如下图: svn是一个集中式的服务器,代码的版本变更信息都存储在svn server服务端,每个客户端磁盘里只有众多版本中的其中一个版本,假如服务端坏掉了,那我们就丢失了版本变更记录。 而git不一样,它是没有中心服务器的,每个人机器上都是一个完整的库,里面就有各个版本的变更信息,我们开发完代码以后先commit到本地仓库,在push推送到远程服务器,假如远端服务器坏掉了,只需要把本地仓库重新push一次即可

md 视频

放肆的年华 提交于 2019-11-26 11:06:38
入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表( 来源: CSDN 作者: cpongo8长长还好还好哈哈哈哈哈哈哈 链接: https://blog.csdn.net/cpongo8/article/details

一致性哈希和随机树:用分布式缓存协议解决互联网中的热点数据

无人久伴 提交于 2019-11-26 10:59:24
【Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web】 Abstract 我们描述了一族用于分布式网络中的缓存协议族,它们可以用来减少或者消除网络中热点的产生。我们的协议是特地为了像因特网这种大型的网络而设计的,在这里由于热点导致的延迟可能非常严重,并且让每台服务器拥有整个网络当前状态的完整信息也不可行。利用现有的网络协议,例如TCP/IP很容易实现我们提出的协议,而且开销很少。所提出的协议使用局部控制,有效利用现有的资源,并且随着网络规模的增加可以优雅地扩容。 我们的缓存协议是基于一种我们称之为一致性哈希的特殊哈希。粗略来说,一致性哈希函数在函数范围发生发生改变时受到的影响最小。通过开发一些较好的一致性哈希函数,我们能构在这个基础上开发出一些不需要用户必须有网络的当前乃至一致性视图。我们相信一致性哈希函数也许最终会被证明在其他的应用中,比如分布式命名服务器或者配额系统(quorum system)。 1 Introduction 我们在本中描述了分布式网络中的缓存协议,可以用来减少或者消除"热点"的发生。大量的客户同时访问一个服务器上的数据时,这个时候就会产生热点。如果站点并没有同时处理这么客户访问的能力的话