散列算法

数据结构与算法之美——散列表——实战篇(上)

拈花ヽ惹草 提交于 2019-12-09 11:34:17
一、前言 通过理论篇,我们知道,散列表的 查询效率 跟 散列函数、装载因子、散列冲突 等都有关系。如果散列函数设计得不好,或者装载因此过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果我们使用的是基于链表的冲突解决方法,那 这个时候,散列表就会退化为链表 ,查询的时间复杂度从O(1)退化为O(n)。 如果散列表中有10万个数据,退化后的散列表查询的效率就下降了10万倍。如何之前运行100次查询只需要0.1秒,那现在就需要1万秒。这样就有可能因为查询操作消耗大量CPU或者线程资源,导致系统无法响应其他请求,从而达到拒绝服务攻击(Dos)的目的。 如何设计一个可以应对各种异常情况的工业级散列表,来 避免在散列冲突的情况下,散列表性能的急剧下降,并且能抵抗散列碰撞攻击 ? 二、如何设计散列函数 散列函数设计的好坏,决定了散列表冲突的概率大小,也直接决定了散列表的性能,那什么才是好的散列函数呢? 1、散列函数的设计不能太复杂 2、散列函数生成的值要尽可能随机并且均匀分布 三、装载因子过大怎么办 提及散列表的装载因子的时候说过,装载因子越大,说明散列表中的元素越多,空闲位置越少,散列冲突的概率就越大。不仅插入数据的过程要多次寻址或者拉很长的链,查找的过程也会因此变得很慢。

如何处理海量数据(长文)

冷暖自知 提交于 2019-12-08 19:07:07
在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题,它的主要难点有以下几个方面: 一、数据量过大,数据中什么情况都可能存在。 如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至 过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时, 前面还能正常处理,突然到了某个地方问题出现了,程序终止了。 二、软硬件要求高,系统资源占用率高。 对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况,如果处理的数据过TB级,小型机是要考虑的,普通的机子如果有好的方法可以考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。 三、要求很高的处理方法和技巧。 这也是本文的写作目的所在,好的处理方法是一位工程师长期工作经验的积累,也是个人的经验的总结。没有通用的处理方法,但有通用的原理和规则。 下面我们来详细介绍一下处理海量数据的经验和技巧: 一、选用优秀的数据库工具 现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软 公司最近发布的SQL Server 2005性能也不错。另外在BI领域:数据库,数据仓库

Java海量数据处理算法

谁都会走 提交于 2019-12-08 18:51:51
文章目录 Hash法 Bit-map法 Bloom filter法 数据库优化法 倒排索引法 正向索引 外部排序法 trie树 兄弟单词 求解兄弟单词的经典例子 堆 双层桶法 MapReduce法 经典实例 top K问题 BFPRT算法(TOP-K问题必会) 重复问题 排序问题 Hash法 在处理海量数据的过程中,使用hash法一般可以快速存取,统计某些数据,将大量数据进行分类,例如提取某日访问网站次数最多的IP地址等. 常用散列函数的构建方法如下: 直接寻址法 取关键字或关键字的某个线性函数值为散列地址,即h(key)=key或h(key)=a*key+b.直接寻址法不会产生冲突,时间复杂度为o(1),空间复杂度为o(n),但由于它没有压缩映像,因此,当关键字集合很大时,使用这种hash函数是不可能实现地址编码的散列的(因为key集合必须有穷且不能超出物理存储大小). 取模法 选择一个合适的正整数p,令h(key)=key mod p.p如果选择的是比较大的素数,则效果比较好,一般选取p为tablesize,即散列表的长度. 数学分析法 根据关键字的个数n和r进制,通过统计在各个位上数符出现频率找出各个位上出现出现次数最接近n/r的数符作为不变的散列地址位. 折叠法 将关键字分成位数为t的几个部分(最后一部分可能小于t),然后把各部分按位对齐进行相加,将所得的和舍弃进位

海量数据处理专题(三)——Hash

戏子无情 提交于 2019-12-08 18:46:25
转: http://blog.redfox66.com/post/mass-data-topic-3-hash.aspx 【什么是Hash】 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的 消息摘要 的函数。 HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。 数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图: 左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征

海量数据处理专题2——Hash

纵饮孤独 提交于 2019-12-08 18:45:22
【什么是Hash】 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的 消息摘要 的函数。 HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。 数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除 也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为 “链表的数组”,如图: 左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。 元素特征转变为数组下标的方法就是散列法。散列法当然不止一种,下面列出三种比较常用的。

详解Https出现的前因后果

我是研究僧i 提交于 2019-12-07 16:34:23
虽然自己不直接从事互联网行业,但是对互联网行业的技术一直没有放松学习,特别是安全方面一直是我薄弱的方面,所以最近踏下心来好好的研究了下互联网安全方面的内容。 网上关于SSL、Https的学习资料比较多,有些讲的太宽泛,有些讲的又不容易理解,我以自己的角度和自己的顺序来好好摸清这些内容。 首先澄清3个概念:SSL、TLS、Https。 SSL:Secure Sockets Layer,中文“安全套接层” TLS:Transport Layer Security,中文“传输层安全协议”,是SSL在1999年标准化后的新名称,基本可以跟SSL做约等号。 HTTPS:Http Over TLS,字面意思就是基于TLS的Http传输。 众所周知Https比Http更安全,从定义中可以看出安全来自于TLS,TLS就是我们要集中力量学习的重点。 SSL/TLS不仅可以被Http over,还可以被其它多种协议Over,比如:FTP、SMTP、POP、Telnet等 问题来了SSL/TLS凭什么更安全? 首先我们看看Http协议存在的安全问题: 1 钓鱼被骗,访问伪造的服务端 2 明文被捕获,敏感信息泄露 3 明文被捕获后篡改内容 4 不管什么报文,重复发起 由于单纯的Http协议具有上面这些风险,那我们理想中的协议应该具备以下特性: 安全性,防止被偷窥,就是对内容加密,被偷窥了别人也看不懂。

Contest100000582 - 《算法笔记》4.2小节——算法初步->哈希

♀尐吖头ヾ 提交于 2019-12-07 04:45:25
文章目录 Contest100000582 - 《算法笔记》4.2小节——算法初步->哈希 讲解: 4.2.1 散列的定义与整数散列 HashTable1 HashTable2 4.2.2 字符串hash初步 例题: 给出N个字符串(恰好三位大写字母组成),再给出M个查询字符串,问每个查询字符串 在N个字符中出现的次数 练习: 1782 Problem A 谁是你的潜在朋友 2066 Problem B 分组统计 6112 Problem C Be Unique (20) 6120 Problem D String Subtraction (20) Contest100000582 - 《算法笔记》4.2小节——算法初步->哈希 讲解: 4.2.1 散列的定义与整数散列 解决冲突的方法: 开放定址法:1)线性探查法 2)平方探查法 3)链地址法 HashTable1 #include < cstdio > const int maxn = 100010 ; bool hashTable [ maxn ] = { false } ; //初始化 int main ( ) { int n , m , x ; scanf ( "%d%d" , & n , & m ) ; for ( int i = 0 ; i < n ; i ++ ) { scanf ( "%d" , & x ) ;

SHA-1算法

蓝咒 提交于 2019-12-06 16:56:59
SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种 密码散列函数 , 美国国家安全局 设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160 位 (20 字节 )散列值,散列值通常的呈现形式为40个 十六进制 数。 介绍 SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种 密码散列函数 , 美国国家安全局 设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160 位 (20 字节 )散列值,散列值通常的呈现形式为40个 十六进制 数。 [1] SHA-1已经不再视为可抵御有充足资金、充足计算资源的攻击者。2005年,密码分析人员发现了对SHA-1的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自2010年以来,许多组织建议用 SHA-2 或SHA-3来替换SHA-1。 Microsoft 、 Google 以及 Mozilla 都宣布,它们旗下的浏览器将在2017年前停止接受使用SHA-1算法签名的 SSL证书 。 2017年2月23日,CWI Amsterdam与 Google 宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA

《图解密码技术》阅读笔记

妖精的绣舞 提交于 2019-12-06 08:52:10
第一章 密码与信息安全常识 不要使用保密的密码算法: 密码算法的秘密早晚会公诸于世 试图通过密码算法本身的保密性来保证安全称之为隐蔽式安全,很蠢。 使用低强度的密码比不进行任何加密更危险 任何密码总有一天会被破解 第二章 凯撒密码: 位移实现加密 知道位移量即可进行逆向移动解密(也可以暴力穷举破解) 替换密码: 将明文中所有字母变替换为另一套字母表 密钥空间:所有密钥的集合 频率分析:明文中字母出现的频率与密文中字母出现的频率是一致的 破译技巧: 高频字母和低频字母都能成为线索 字母连成单词 Enigma 国防军密码本的“每日密码”通信密码 通信密码是3位,写两次共6位 每日密码加密后的通信密码和通信密码加密后的密文被拼接发送给对端 弱点: 将通信密码连续输入两次 通信密码是人为选定的 必须派发国防军密码本 第三章 XOR(异或) 两个相同的数进行异或运算的结果一定为0 一次性密码本 即使可以遍历整个密码空间,遍历解密得到明文,也无法确认哪个是正确的明文 一次性密码是无条件安全的,在理论上是无法破译的 不实用: 密钥在两边配送 密钥保存 密钥重用 密钥同步 密钥生成 DES DES是一种将64位明文加密成64位密文的对称密码算法 密钥长度是56bit(64bit,每隔7位有1bit错误检验bit) 轮: 将输入的数据(64bit)等分为左右两部分

散列表(哈希)

白昼怎懂夜的黑 提交于 2019-12-06 07:00:45
散列表 ( 哈希 ) 简介 简述 散列函数 冲突 开放地址法 链接法(也称链地址法) 链接法对比与开放地址法的优缺点 名词解释 我们来讲述散列表。 散列表是一种数据结构,它具有以下性质: 应用广泛 查找快速 等 举个例子。 你在超市工作,一位顾客来购买商品,你家超市刚刚好没有自动销售机,你得亲自去查找该商品的价格。如果我们是这样的话,那么顾客每买一个商品,都要找一下该商品并且知道它的价格。那么我们非常花费时间。如果我们能够找到这样一个人:能够记住所有商品的价格的人。那么我们在帮顾客结账的时候将会非常快速。 即使你是用一个小本本把你商店的东西都记上了,并且是按照一定的顺序记号的。即使使用二分查找,那么我们也会花费一定的时间。想必此时顾客已经不耐烦了。他们可能会说:“怎么这么久!!!”,然后你的商店可能会产生很多很多的怨气...... 我们从数据结构的方面去看这个问题,那么所有的商品就有了这样的一个特性: 商品的key 以及 商品的 卫星数据 。 如果我们按照一个特殊的函数去把相对应的 KEY 值转换成另一个东西,并且记录在小本子上,我们只需直接翻到这个本子相对应的部分,就可以找到了该商品的价格了,以及还有其他的信息。 ---->BACK<---- 散列函数 那么我们的问题来了,我们该怎样创建这个数据类型呢?首先了解一下,散列函数 散列函数是“将输入映射到数字”