hash函数

java容器

陌路散爱 提交于 2019-12-03 01:48:11
原文链接 一、概览 容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection 1. Set TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。 2. List ArrayList:基于动态数组实现,支持随机访问。 Vector:和 ArrayList 类似,但它是线程安全的。 LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 3. Queue LinkedList:可以用它来实现双向队列。 PriorityQueue:基于堆结构实现,可以用它来实现优先队列。 Map TreeMap:基于红黑树实现。 HashMap:基于哈希表实现。 Hashtable:和

Redis 存储结构设计

匿名 (未验证) 提交于 2019-12-03 00:44:02
Base 2.8.7 Redis是一个包含了很多Key-Value对的大字典,这个字典支持的Value非常丰富,可以为 字符串、哈希表、列表、集合和有序集 ,基于这些类型丰富的value,扩展出了功能强大的操作,例如hmset、lpush、sadd等 字典 字典是Redis最基础的数据结构,一个字典即一个DB,Redis支持多DB Redis字典采用 Hash表 实现,针对碰撞问题,其采用的方法为 “ 链地址法 ” ,即将多个哈希值相同的节点串连在一起, 从而解决冲突问题。 “链地址法”的问题在于当碰撞剧烈时,性能退化严重,例如:当有n个数据,m个槽位,如果m=1,则整个Hash表退化为链表,查询复杂度O(n) 为了避免Hash碰撞攻击,Redis随机化了Hash表种子 Redis的方案是 “双buffer” ,正常流程使用一个buffer,当发现碰撞剧烈(判断依据为当前槽位数和Key数的对比),分配一个更大的buffer,然后 逐步 将数据从老的buffer迁移到新的buffer。 Redis字典结构如下: typedef struct dict { dictType *type; void *privdata; dictht ht[2]; //双buffer int rehashidx; int iterators; } dict; typedef struct dictht

HashMap实现原理及源码分析

匿名 (未验证) 提交于 2019-12-03 00:43:02
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。 Ŀ¼     一、 什么是哈 希表   二、 HashMap实现原理   三、 为何HashMap的数组长度一定是2的次幂?   四、 重写equals方法需同时重写hashCode方法   五、 总结 一、什么是哈希表   在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能    数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)    线性链表 :对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)    二叉树

散列表

匿名 (未验证) 提交于 2019-12-03 00:36:02
一.散列表(Hash Table) 1.用来实现字典操作的一组有效数据结构 2.直接寻址表(直接寻址):数组T[0...m-1],可以存放动态集合的元素 1 class direct_address_table: 2 ‘‘‘ 直接寻址表 ‘‘‘ 3 def __init__ (self, T=[], size= 0): 4 if len(T) == 0: 5 self.T = [None for i in range(size)] 6 else : 7 self.T = T 8 self.size = size 9 ‘‘‘ 对于节点 ‘‘‘ 10 def search(self, k): 11 return self.T[k] 12 13 def insert(self, x): 14 self.T[x.key] = x 15 16 def delete(self, x): 17 self.T[x.key] = None 18 19 class Node: 20 def __init__ (self, key): 21 self.key = key 22 23 T= [] 24 dat=direct_address_table(T,10 ) 25 x=Node(2 ) 26 print (dat.insert(x)) 直接寻址表 3.散列表:利用散列函数(hash function

KEY分区和HASH分区的区别

匿名 (未验证) 提交于 2019-12-03 00:27:02
KEY分区和HASH分区相似,但是KEY分区支持除text和BLOB之外的所有数据类型的 分区,而HASH分区只支持数字分区,KEY分区不允许使用用户自定义的表达式进行分 区,KEY分区使用系统提供的HASH函数进行分区。当表中存在主键或者唯一键时,如 果创建key分区时没有指定字段系统默认会首选主键列作为分区字列,如果不存在主键 列会选择非空唯一键列作为分区列,注意唯一列作为分区列唯一列不能为null。 转载请标明出处: KEY分区和HASH分区的区别 文章来源: KEY分区和HASH分区的区别

教你如何迅速秒杀掉:99%的海量数据处理面试题

匿名 (未验证) 提交于 2019-12-03 00:26:01
我是慕小白, 一个专注前端/Java/Python/大数据/人工智能资源分享的技术人,我会在群里不定期免费分享一些资源,资源包括各种VIP教程(我会严格审核质量),以及书籍和优质文章。目前群是免费加入,后面会考虑会加收一点钱,当做群运营费用,用户买资料以及发红包给那些活跃的人。 程序员资源交流2群(加群需注明来意,最好可以注明自己的CSDN账号,否则不会允许加入):135948728 前言 一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了 哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也 甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理 面试题与十个方法大总结的一般抽象性总结。 毕竟受文章和理论之限,本文将摒弃绝大部分的细节,只谈方法/模式论,且 注重用最通俗最直白的语言阐述相关问题。最后,有一点必须强调的是,全文行 文是基 于面试题的分析基础之上的,具体实践过程中,还是得具体情况具体分 析,且场景也远比本文所述的任何一种情况复杂得多。 OK,若有任何问题,欢迎随时不吝赐教。谢谢。 何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量, 就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大, 导致无法一次性装入内存。 那解决办法呢?针对时间

分布式缓存原理----Hash环/一致性Hash原理/Hash槽

匿名 (未验证) 提交于 2019-12-03 00:22:01
Memcached:为分布式客户端做分发,hash环 TWY Redis: 为分布式客户端做分发 , hash环 当前,Memcached、Redis这类分布式kv缓存已经非常普遍。从本篇开始,本系列将分析分布式缓存相关的原理、使用策略和最佳实践。 我们知道Memcached的分布式其实是一种“伪分布式”,也就是它的服务器结点之间其实是相互无关联的,之间没有网络拓扑关系,由客户端来决定一个key是存放到哪台机器。 具体来讲,假设我有多台memcached服务器,编号分别为m0,m1,m2,…。对于一个key,由客户端来决定存放到哪台机器,那最简单的hash公式就是 key % N,其中N是机器的总数。 但这有个问题,一旦机器数变少,或者增加机器,N发生变化,那之前存放的数据就全部无效了。因为你按照新的N值取模计算出的机器编号,和当时按旧的N值取模算出的机器编号肯定是不等的,也就意味着绝大部分缓存会失效。 这个问题的解决办法就是用1种特别的Hash函数,尽可能使得,增加机器/减少机器时,缓存失效的数目降到最低,这就是Hash环,或者叫一致性Hash。 Hash环 (2)把key也hash到这个环上。然后在这个环上进行匹配,看这个key和哪台机器匹配。 具体来讲,如下: 假定有这样一个Hash函数,其值空间为(0到2的32次方-1) ,也就是说,其hash值是个32位无整型数字

Hash函数及其重要性

匿名 (未验证) 提交于 2019-12-03 00:22:01
不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性。今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码。 密码学是非常复杂的一门学科,我不是这方面的专家,在很多大学和安全机构,在这个领域都有长期的研究。 本文我试图使事情简单化,呈现给大家的是一个 web 应用中安全存储密码的合理方法。 Hashing 将一段数据(无论长还是短)转成相对较短的一段数据,例如一个字符串或者一个整数。 这是通过使用单向哈希函数来完成的。“单向” 意味着逆转它是困难的,或者实际上是不可能的。 加密可以保证信息的安全性,避免被拦截到被破解。Python 的加密支持包括使用 hashlib 的标准算法(例如 MD5 和 SHA),根据信息的内容生成签名,HMAC 用来验证信息在传送过程中没有被篡改。 一个通常使用的 hash 函数的例子是 md5() ,这也是当前在很多不同语言和系统中比较流行的: import hashlib data = "Hello World" h = hashlib . md5 () h . update ( data ) print ( h . hexdigest ()) # b10a8db164e0754105b7a99be72e3fe5 为了计算一个数据块(这儿是 ASCII 字符串)的 MD5

以太坊源码解析 - 交易源码分析

匿名 (未验证) 提交于 2019-12-03 00:22:01
以太坊交易基本流程: 完整流程分为以下几个步骤: 发起交易:指定目标地址和交易金额,以及需要的gas/gaslimit 交易签名:使用账户私钥对交易进行签名 提交交易:把交易加入到交易缓冲池txpool中(会先对交易签名进行验证) 广播交易:通知EVM执行,同时把交易信息广播给其他结点 用户通过JSON RPC发起 eth_sendTransaction 请求,最终会调用 PublicTransactionPoolAPI 的 SendTransaction 实现, 首先根据from地址查找到对应的wallet,检查一下参数值, * 通过SendTxArgs.toTransaction()创建交易 * 通过Wallet.SignTx()对交易进行签名 * 通过submitTransaction()提交交易 //代码位于 `internal/ethapi/api.go` func (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs, passwd string ) (common.Hash, error) { if args.Nonce == nil { // Hold the addresse's mutex around signing to prevent concurrent

hash扩展攻击

匿名 (未验证) 提交于 2019-12-03 00:19:01
hash扩展攻击产生 hash扩展攻击存在的原因有两个,第一个是现在常用的hash函数如md5和sha系列的是采用的MD迭代结构;第二个就是验证逻辑的不严谨。 1、MD(Merkle-Damgard)迭代结构 这种结构定义的Hash函数中,输入消息m,并将其分为L个固定长度,若最后一个不满足输入分组长度的要求,按照一定规则进行填充。该Hash函数重复使用一个压缩函数f。压缩函数f有两个输入,一个是前一阶段的n bit输入,另外一个是源于消息b bit分组,并产生一个n bit的输出,作为下一个阶段的输入。算法开始要有一个初始值IV。具体如下图: 如上图,假设明文M分组为Y1、Y2、Y3、Y4。看第一步,先将消息分组Y1与初始变量IV进行f函数操作之后,得出的值和Y2继续使用f函数操作,直到最后得出的值就是hash值,这就是MD迭代结构。 MD5和sha系列的算法也是这种结构,只不过它们才去不同长度的IV和f函数。 2、验证逻辑的不严谨 思考以下情况: A生成一个key和消息m,计算h=hash(m,key),公布{m,h},A采用这种方式验证自己的消息m是否被篡改过。此时,A觉得没人能更改他的消息m,因为更改之后,无法更改h,因为篡改者没有key。也就无法计算h_fake=hash(m_fake, key)。变可以采用hash扩展攻击。 3、攻击产生 篡改者没有key