哈希函数

比特币中所用到的密码学原理

若如初见. 提交于 2020-03-17 19:08:01
1.哈希函数 密码学中的哈希函数有两个重要的性质,第一是哈希碰撞,哈希碰撞是指给定任意两个输入x、y,并且x≠y使得H(x)=H(y)。关于哈希碰撞有两个很重要的结论,其一哈希碰撞是必然存在的,因为哈希函数的输出空间往往是固定的,但输入空间可以是无限的,所以根据鸽笼原理哈希碰撞是必然存在的。其二是没有办法从理论上证明哈希函数是存在哈希碰撞的。这意味着没有高效的方法去人为制造哈希碰撞,所以哈希碰撞可以用来确定某一个信息是否被篡改过。 第二个性质是哈希函数的计算过程是单向不可逆的,我们没有高效的方法从哈希函数的输出来求的哈希函数的输入。不过这个性质的成立需要满足两个前提条件,一是输入空间足够大,二是输入的分布比较平均。所以我们对一个给定值x取哈希时通常会将x拼接上一个随机数一起取哈希即H(x ll nonce)。 2.签名 在讲签名之前先了解一下比特币账户,比特币中的账户是一对公私钥对,发起一个交易时使用自己的私钥进行签名,发布到网络中,系统中的其它节点可以使用公钥验证签名,这样就可以证明这笔交易确定是由你发起的。这里值得注意的一点是因为公私钥对会使用到哈希函数,所以在实现公私钥对的时候需要一个好的随机源。 来源: https://www.cnblogs.com/yishi-san/p/12512217.html

哈希表

为君一笑 提交于 2020-03-05 00:38:36
一、介绍 哈希表是根据关键字(Key)而 直接访问记录 的数据结构。它通过把 关键字 映射到哈希表中的 一个位置 来访问 记录 ,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。 散列函数:将记录的关键字映射到该记录在哈希表中的存储位置,即 f(关键字) = 记录的存储位置 示例:以查新华字典为例,假设我们要查看“猪”的详细信息,我们一般会根据拼音“zhu”去查找拼音索引,通过拼音索引我们得到了“zhu”在字典中的页码数。其中, 拼音索引就是 散列函数 ,“zhu”就是 关键字 ,查到的页码值就是 哈希值 ,而“猪”的详细信息则是我们所 要访问的记录 。 二、哈希冲突 哈希冲突:当key1≠key2时,却有f(key1) = f(key2) 。 三、拉链法 当发生哈希冲突时,我们通过两个不同的关键字,将访问到同一个记录。既然它们在哈希表中的存储位置相同,那我们可以在该位置 引出一个链表 ,将所有根据散列函数定位到该存储位置的记录都插入到该链表上。 这是哈希表最常用的一种实现方法,可以理解为“链表的数组”,其具有以下优点:   a.寻址容易(数组的特点)   b.插入和删除容易(链表的特点) 所以查找、插入、删除(有时包括删除)可以达到O(1)。 示例:现有一堆数据{1, 12, 26, 337, 353...},散列函数是H(key)=key mod 16

Bloom Filter 原理及实现

≯℡__Kan透↙ 提交于 2020-02-24 13:05:39
题外话: 很久没写博客了,因为前一段时间过年在家放假,又因为自己保研了,所以一直比较闲。整个假期,基本都在准备毕业设计的相关内容。我毕业设计的方向是关于搜索引擎的,因此,期间阅读了大量相关论文。阅读了很多论文和技术书籍之后,我有几点感触。首先,发现国内很多论文或是书籍只是大量引述其他人的研究结果,自己的独特的见解非常少,一篇文章,70%的内容都是在以介绍为主,感觉发这样的论文是没有什么意义的。相反,国外尤其是像MIT,斯坦福,google之类的领域专家发表很多极其优秀的论文,阅读后给人一种震撼。我之前在网上搜索技术文章或是论文的时候经常绕过英文的,现在发现国外的确有非常多优秀的外文文章,所以无障碍英文阅读能力是提升自己专业水平的重要因素。 我现在已经逐渐习惯阅读外文文章和书籍。 期间,我还翻译了一篇关于网络信息采集和索引的外文文章,收获很大。不是因为,我从中获得了多少知识,而是在翻译的过程中,我了解了作者精心的设计思路以及严谨的语言表达,也锻炼了我翻译的能力以及组织语言的能力。 废话不多说了,开始正题,写个在爬虫系统中常用的URL去重经典算法Bloom Filter. 正题: Bloom Filter概念和原理 引用一篇讲述非常好的文章。 http://blog.csdn.net/jiaomeng/article/details/1495500 ,其博客里还有很多关于Bloom

哈希表

ⅰ亾dé卋堺 提交于 2020-02-24 12:09:55
前言 # 哈希表,又名散列表。是非常常用的一种数据结构,C#的Hashtable、字典,Java的HashMap,Redis的Hash,其底层实现都是散列表。而在一些互联网公司的面试中,更是技术面试官们必问的一道题目。本文将简单了解哈希表(散列表)这种数据结构。 一、散列表 # 1.1 散列表 # 散列表(哈希表),其思想主要是基于数组支持按照下标随机访问数据时间复杂度为O(1)的特性。可是说是数组的一种扩展。假设,我们为了方便记录某高校数学专业的所有学生的信息。要求可以按照学号(学号格式为:入学时间+年级+专业+专业内自增序号,如2011 1101 0001)能够快速找到某个学生的信息。这个时候我们可以取学号的自增序号部分,即后四位作为数组的索引下标,把学生相应的信息存储到对应的空间内即可。 如上图所示,我们把学号作为key,通过截取学号后四位的函数后计算后得到索引下标,将数据存储到数组中。当我们按照键值(学号)查找时,只需要再次计算出索引下标,然后取出相应数据即可。以上便是散列思想。 1.2 散列函数 # 上面的例子中,截取学号后四位的函数即是一个简单的散列函数。 Copy //散列函数 伪代码 int Hash(string key) { // 获取后四位字符 string hashValue =int.parse(key.Substring(key.Length-4, 4)

哈希表

孤街醉人 提交于 2020-02-23 10:50:38
1.什么是哈希表? 哈希表:根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或散列,所得的存储位置称哈希地址或散列地址。 2.哈希表的特点: (1)哈希函数是一个映射,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表允许的长度范围内即可; (2)对不同的关键字可能得到同一哈希地址,即key1≠key2,而f(key1)=f(key2),这种现象叫“冲突”。“冲突”只能减少不能避免,因为关键字数量巨大,而地址值只能为哈希表中的值,数量较小。 3.常用的构造哈希函数 1.直接定址法 取关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a*key+b,实际中很少用。 2.数字分析法 对关键字进行分析,尽量找随机性大的数字。 3.平方取中法 取关键字平方后的中间几位为哈希地址,这是一种较常用的构造哈希函数的方法。取的位数由表长决定。 4.折叠法 将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的折叠和(舍去进位)作为哈希地址,这方法称为折叠法。关键字位数很多,而且关键字中每一位上数字分布大致相同时,可以采用折叠法得到哈希地址。 5.除留余数法

数据结构与算法18—哈希表(散列表)

≯℡__Kan透↙ 提交于 2020-02-23 10:29:44
哈希表的概念 哈希表(Hash Table)是一种特殊的数据结构,它最大的特点就是可以快速实现查找、插入和删除。 我们知道,数组的最大特点就是:寻址容易,插入和删除困难;而链表正好相反,寻址困难,而插入和删除操作容易。那么如果能够结合两者的优点,做出一种寻址、插入和删除操作同样快速容易的数据结构,那该有多好。这就是哈希表创建的基本思想,而实际上哈希表也实现了这样的一个“夙愿”,哈希表就是这样一个集查找、插入和删除操作于一身的数据结构。 哈希表 (Hash Table):也叫散列表,是根据关键码值(key-value)而直接进行访问的数据结构,也就是我们常用到的map。 哈希函数 :也称为是散列函数,是Hash表的映射函数,它可以把任意长度的输入变换成固定长度的输出,该输出就是 哈希值 。哈希函数能使对一个数据序列的访问过程变得更加迅速有效,通过哈希函数,数据元素能够被很快的进行定位。 哈希表和哈希函数的标准定义:若关键字为k,则其值存放在h(k)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为哈希函数,按这个思想建立的表为哈希表。 设计出一个简单、均匀、存储利用率高的散列函数是散列技术中最关键的问题。 但是,一般散列函数都面临着冲突的问题。两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞

哈希表中的查找

非 Y 不嫁゛ 提交于 2020-02-23 10:24:12
基本概念 哈希表 ( hash table ):又称散列表,其基本思路是,设要存储的元素个数是n,设置一个长度为m的连续存储单元,以每个元素的关键字作为自变量,通过哈希函数(h(k))把k映射到一个内存单元,并把该元素存在这个内存单元中,把像这样构造的线性表存储结构称为哈希表。 哈希冲突 ( hash collisions ):在构建哈希表时,出现两个不同关键词对应相同的哈希值,这种现象称作哈希冲突。 装填因子 ( loading factor ) : 设哈希表空间大小为n,填入表中元素个数为m,则$α=/frac{m}{n}$为哈希表的装填因子。 哈希查找两项基本工作: 计算位置:构造哈希函数确定关键词的位置 解决冲突:应用某种策略解决多个关键词位置相同的问题 这种查找的时间复杂度几乎是常量O(1),即查找时间与问题规模无关。 哈希函数的构造 一个好的哈希函数: 计算简单,以便提高转换速度 关键词对应地空间分布均匀,以尽量减少冲突 直接定址法 是以关键字k加上某个常量c作为哈希地址的方法,其哈希函数为:h(k)=k+c 特点:哈希函数计算简单。当关键字分布基本连续时,可以用直接定址法;否则,将造成内存单元大量浪费 除留余数法 是用关键字k除以整数p所得的余数作为哈希地址,表示为h(k)=k mod p 特点:计算比较简单,适用范围广,是最经常使用的一种哈希函数。

数据结构---->哈希表

浪尽此生 提交于 2020-02-23 10:23:25
一、哈希表 哈希表又称散列表。 哈希表存储的基本思想是:以数据表中的每个记录的关键字k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。 在此称该函数H为哈希函数或散列函数。按这种方法建立的表称为哈希表或散列表。 例如,要将关键字值序列(3,15,22,24),存储到编号为0到4的表长为5的哈希表中。 计算存储地址的哈希函数可取除5的取余数算法H(k)=k% 5。则构造好的哈希表如图所示。 理想情况下,哈希函数在关键字和地址之间建立了一个一一对应关系,从而使得查找只需一次计算即可完成。由于关键字值的某种随机性,使得这种一一对应关系难以发现或构造。因而可能会出现不同的关键字对应一个存储地址。即 k1≠k2 , 但 H(k1)=H(k2 ), 这种现象称为 冲突 。 把这种具有不同关键字值而具有相同哈希地址的对象称 “ 同义词 ” 。 在大多数情况下,冲突是不能完全避免的。这是因为所有可能的关键字的集合可能比较大,而对应的地址数则可能比较少。 对于哈希技术,主要研究两个问题: (1)如何设计哈希函数以使冲突尽可能少地发生。 (2)发生冲突后如何解决 。 二、哈希函数 构造好的 哈希函数 的方法,应能使冲突尽可能地少,因而应具有较好的随机性。这样可使一组关键字的散列地址均匀地分布在整个地址空间

数据结构 - 布隆过滤器(Bloom Filter)

谁都会走 提交于 2020-02-01 22:45:50
思考 如果要经常判断1个元素是否存在,你会怎么做? 很容易想到使用哈希表(HashSet、HashMap),将元素作为key去查找 时间复杂度:O(1),但是空间利用率不高,需要占用比较多的内存资源 如果需要编写一个网络爬虫去爬10亿个网站数据,为了避免爬到重复的网站,如何判断某个网站是否爬过? 很显然,HashSet、HashMap并不是非常好的选择 是否存在时间复杂度低、占用内存较少的方案? 布隆过滤器(Boolm Filter) 1970年由布隆提出 它是一个空间效率高的概率型数据结构,可以用来告诉你:一个元素一定不存在或者可能存在 优缺点 优点:空间效率和查询时间都远远超过一般的算法 缺点:有一定的误判率、删除困难 它实质上是一个很长的二进制向量和一系列随机映射函数(Hash函数) 常见应用 网页黑名单系统、垃圾邮件过滤系统、爬虫的网站判重系统、解决缓存穿透问题 原理 假设布隆过滤器由20位二进制、3个哈希函数组成,每个元素经过哈希函数处理都能生成一个索引位置 添加元素:将每一个哈希函数生成的索引位置都设为1 查询元素是否存在 如果一个哈希函数生成的索引位置不为1,就代表不存在(100%准确) 如果一个哈希函数生成的索引位置都为1,就代表存在(存在一定的误判率) 添加、查询的时间复杂度都是:O(k),k是哈希函数的个数。 空间复杂度是:O(m),m是二进制位的个数 误判率

布隆过滤器

十年热恋 提交于 2020-01-30 14:50:10
不同的数据结构有不同的适用场景和优缺点,你需要仔细权衡自己的需求之后妥善适用它们,布隆过滤器就是践行这句话的代表。 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。 实现原理 HashMap 的问题 讲述布隆过滤器的原理之前,我们先思考一下,通常你判断某个元素是否存在用的是什么?应该蛮多人回答 HashMap 吧,确实可以将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇高。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。 还比如说你的数据集存储在远程服务器上,本地服务接受输入,而数据集非常大不可能一次性读进内存构建 HashMap 的时候,也会存在问题。 布隆过滤器数据结构 布隆过滤器是一个 bit 向量或者说 bit 数组,长这样: image 如果我们要映射一个值到布隆过滤器中