hash函数

散列表

霸气de小男生 提交于 2020-01-31 16:41:24
众所周知,散列表是一种十分重要的数据结构,接下来就从各个方面分析下跟散列表相关的问题。主要解决什么是散列表,散列冲突的解决方法, 以及各种方法的优缺点。 概览图: 什么是散列表? 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构,是数组的衍生体。 散列表的用途? 也就是说,散列表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 如何设计散列函数? 散列函数的基本要求: 散列函数计算得到的散列值是一个非负整数; 如果 key1 = key2,那 hash(key1) == hash(key2); 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2); 函数需要足够简单,复杂的函数,在计算过程中需要消耗过多的cpu资源; 该函数计算结果 需要随机并且分布均匀; 我来解释一下这三点。 其中,第一点理解起来应该没有任何问题。因为数组下标是从 0 开始的,所以散列函数生成的散列值也要是非负整数。 第二点也很好理解。相同的 key

Hash签名 (数字摘要算法)

ぐ巨炮叔叔 提交于 2020-01-29 21:11:55
一、什么是Hash签名? Hash签名是最主要的数字签名方法,也称之为数字摘要法(Digital Digest)或数字指纹法(Digital Finger Print)。数字摘要就是采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。 二、数字签名和验证的文件传输过程如下: (1) 被发送文件用MD5编码加密产生128bit的数字摘要。 (2) 发送方用自己的私用 密钥 对摘要再加密,这就形成了数字签名。 (3) 将原文和加密的摘要同时传给对方。 (4) 对方用发送方的公共密钥对摘要解密,同时对收到的文件用MD5编码加密产生又一摘要。 (5) 将解密后的摘要和收到的文件在接收方重新加密产生的摘要相互对比。如两者一致,则说明传送过程中信息没有被破坏或篡改过。否则不然。 三、常见Hash算法 : MD2 MD4 MD5 HAVAL SHA 来源: https://www.cnblogs.com/naray/p/4191543.html

Java--集合框架之Map接口

别等时光非礼了梦想. 提交于 2020-01-29 13:44:26
Java集合框架总图 Map接口和具体实现类 Java集合总体分为两个根接口,Map和Collection,其中Collection是单列集合,Map是双列集合。 Map与List、Set接口不同,它并不继承自Collection,它是由一系列键值对组成的集合,提供了key到value的映射。在Map中一个key对应一个value,所以key的存储不可重复,但value可以。 哈希结构——通过关键码找到值的数据结构 哈希函数——建立关键字和值的映射关系 注:好的哈希函数能使值均匀的分步在哈希结构中 生成哈希函数的两种方式 (1)直接寻址法:f(x)=kx+b(k和b是常数) (2)除留余数法:f(x)=x mod m (m<p)(m小于哈希长度p) 哈希冲突的两种解决方式 (1)链地址法:当发生哈希冲突时,将哈希到对应位置的值连接在该位置的数据后面。 (2)线性探测法 Map接口常用方法 int size ( ) ; //map集合中存储的键值对的个数 boolean isEmpty ( ) ; //判断map集合是否为空 true:空 false:不为空 boolean containsKey ( Object key ) //判断集合中是否存在该键key boolean containsValue ( Object value ) ; ////判断集合中是否存在该值value

在 Vue 中手动实现一个 vue-router

纵饮孤独 提交于 2020-01-29 09:41:09
在 Vue 中手动实现一个 vue-router 单页面应用 router 路由实现原理 1. hash 1.1 hash 实现路由的原理 1.2 hash 实现路由的核心步骤 1.3 hash 实现路由的完整代码 2. history 2.1 history 实现路由的原理 1.2 history 实现路由的核心步骤 1.3 history 实现路由的完整代码 本文要点: 了解单页面应用 router 路由的原理。 通过实战手动实现一个 vue-router 加深单页面路由的理解。 单页面应用 router 路由实现原理 单页面应用可通过 hash 和 history 两种方式实现路由。实现路由要思考两个问题。第一、如何获取当前路径;第二、如何监听当前路径变化。 1. hash hash 的方式即浏览器地址栏中含有 # 标志,该标志后面的部分即为 hash 值。示例: http://localhost:8080/#/index 1.1 hash 实现路由的原理 地址栏中 # 后面的值即为 hash 值。该 hash 值通常为路径 path,可通过 location.hash 获取当前路径。 监听当前路径变化的方法为 onhashchange 。 1.2 hash 实现路由的核心步骤 通过 hash 方式在 Vue 中实现一个简易路由,核心步骤如下: 获取路由参数 options;

dict.c设计思想

試著忘記壹切 提交于 2020-01-29 08:24:52
双hash_table设计 typedef struct dict { dictType * type ; void * privdata ; dictht ht [ 2 ] ; long rehashidx ; int iterators ; } dict ; 作者在dict数据类型中引入了两个hash_table,其作用是为了动态变化hash_table的大小。 按照常规操作,如果我们想要将一个hash_table的大小进行动态变化,我们需要进行两个步骤 1:改变数组大小 2:将old_hash_table内全部元素进行rehash,重新链接至new_hash_table上。 如果我们在瞬时间内完成从old_hash_table到new_hash_table的转化的话,意味着我们必须对old_hash_table的元素全部遍历一遍,这种操作显然是很费时间的,容易导致CPU在一段时间内处于一个很繁忙的状态(这里没有引入线程什么的,所以这个操作在dict内存储很多数据时,很可能致使Redis无法及时相应其他请求,而致使服务质量下降)。 因此这里引入了一个 rehash 状态,表示当前字典正在进行 rehash ,即将old_hash_table数据迁移至new_hash_table的状态。通过阅读源代码,我们会发现这样一个函数 static void _dictRehashStep

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

为君一笑 提交于 2020-01-29 08:03:39
原文链接:https://blog.csdn.net/v_july_v/article/details/7382693 作者:July 出处:结构之法算法之道 blog 本文经过大量细致的优化后,收录于我的新书《 编程之法:面试和算法心得 》第六章中,新书目前已上架 京东 / 当当 前言 一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名 :-),同时,此文可以看做是对这篇文章: 十道海量数据处理面试题与十个方法大总结 的一般抽象性总结。 毕竟受文章和理论之限,本文将摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语言阐述相关问题。最后,有一点必须强调的是,全文行文是基于面试题的分析基础之上的,具体实践过程中,还是得具体情况具体分析,且各个场景下需要考虑的细节也远比本文所描述的任何一种解决方法复杂得多。 OK,若有任何问题,欢迎随时不吝赐教。谢谢。 何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如 Bloom filter/Hash/bit-map/堆

哈希表

南笙酒味 提交于 2020-01-27 07:30:50
一.符号表问题 1.一个表里面放着n条记录,(记录x:x通常是一个指向实际数据的指针) 2.在每个记录中,存在一个记录的键,还存在一些卫星数据(属于键的附加数据) 3.排序是对记录进行排序,而不是关键字 4.对表进行操作:添加记录,删除记录,查找具有特定键的记录 二.直接映射表(数组) 1.适用于关键字的全域(可能存储的关键字)较小的情况 2.数组的每个位置对应全域中的一个关键字,关键字k的元素被存放在槽k中 3.缺陷:如果关键字只有几千,而关键字的全域需64位来表示,导致大量空槽 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

vue-router原理

筅森魡賤 提交于 2020-01-27 07:01:05
文章目录 用hash、history实现单页面 hash history vue-router 三种模式 hash和history的区别 vue-router的实现 其他问题 1、什么是单页应用,原理? 2、单页面和多页面的区别? 3、Vue-router有哪些钩子?使用场景? 4、完整的路由导航解析流程 5、vue-router的三种跳转方式 用hash、history实现单页面 hash hash原理:hash router 有一个明显的标志是url 中带有#, 我们可以通过onhashchange监听url中的hash来进行路由跳转 # 后面的 fragment 发生改变时,页面不会重新请求,其他参数发生变化,都会引起页面的重新请求 Onhashchange事件触发条件: 这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+支持该事件。 直接更改浏览器地址,在最后面增加或改变#path; 通过改变location.href或locaion.hash的值 通过触发点击带锚点的连接 浏览器前进后退可能导致hash的变化,前提是两个网页地址中的hash值不同(会留下一个历史记录) 它的使用方法有三种: window.onhashchange = func; <body

字符串匹配(上)

一曲冷凌霜 提交于 2020-01-26 02:59:00
BF算法 Brute Force,暴力匹配算法/朴素匹配算法 相关概念 主串(长度n) 模式串 (长度m) 子串 思想:主串中,从0 - n-m,依次匹配 最坏时间复杂度:O(n*m) 常用原因 模式串和主串不会太长,不匹配时可跳到下一位重新开始比较,效率比O(n*m)高很多 思想简单,符合KISS设计原则 BF算法实现 String . prototype . indexOf = function ( pattern ) { let str = this let index = - 1 for ( let i = 0 ; i < str . length - pattern . length + 1 ; i ++ ) { let j = 0 //子串与模式串比较 for ( ; j < pattern . length ; j ++ ) { if ( str [ i + j ] == pattern [ j ] ) { continue } else { break } } if ( j == pattern . length ) { index = i break } } return index } var str = 'asdfghjklqwerty' str . indexOf ( 'sd' ) RK算法 Rabin-Karp 思想:用Hash算法,优化子串对比 原理

散列表(Hash Table)总结

别等时光非礼了梦想. 提交于 2020-01-25 11:57:29
复习了下散列表(Hash Table),总结如下: 1.直接寻址表 直接送数组进行对应,但是当要存储的关键字集合K相对于域U很小时,就会很浪费空间。 2.散列表 利用Hash函数进行映射 “碰撞”发生时,利用链接法解决 3.散列函数的选择 3.1除法散列表 h(k) = k mod m,m是与2的整数幂不太接近的质数 3.2乘法散列表 h(k) = 【m*(k*A mod 1)】向下取整,其中A最好取0.618....... 3.3全域散列 h a,b (k) = ((a*k + b) mod p) mod m,a属于{1, 2 ..., p-1},b属于{0, 1 ..., p-1},p是质数,k都落在{0, 1, ..., p-1}中,p > m 4.开放寻址法 4.1线性探查 h(k, i) = (h'(k) + i) mod m, 其中i = 0, 1, ..., m-1,但容易造成一次群集,即随着时间的推移,连续被占用的槽不断增加,平均查找时间也随着不断增加。 4.2二次探查 h(k, i) = (h'(k) + c1*i + c2*i 2 ) mod m,其中h'(k)为辅助散列函数,c1和c2为辅助常数,i = 0, 1, ..., m-1,虽比线性探查优化了一点,但会造成二次群集。 4.3双重散列 h(k, i) = (h1(k) + i*h2(k)) mod m