哈希

哈希面试题--海量数据

妖精的绣舞 提交于 2019-12-08 17:43:31
哈希切割top K问题 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,如何找到top K的IP? (1)文件太大,100g,肯定不可能一次加载到内存进行处理,这里就必须将文件进行切割了,可是依据哪种方法进行切割呢?假设只是从前到后等份切割的话,将文件切割n份(切割的份数依据所给的内存大小),第一份中假设IP地址为a出现次数最多,第二份中b出现的次数最多,这样比较出来,假设a比b大,那得出的结果就是IP地址为a的出现次数多,可是?假设第一份中也有地址为b的IP呢?这样分割出来的文件,不能保证相同IP地址被分到同一个文件当中,这样算出的结果就肯定不正确了。这里我们应该想到使用哈希的思想,我们可以给出n个文件,(n的取值取决于给定的内存大小),将点分十进制的IP地址转化为整数,利于哈希函数(哈希函数采用直接定址法),求出IP地址所对应文件的编号,这样将所有地址分派到不同编号的文件中,相同的地址一定在同一个文件当中,依次遍历每个文件,统计出每个IP地址出现的次数,这样就可以找到出现次数最多的IP地址。 (2)top K问题的解决办法我们很容易想到用堆,首先,搞清楚是要出现次数最多的K个IP还是出现次数最少的K个IP,如果是最多的,可以给小堆,如果最少的,给的就是大堆;假设这里我们要的是出现次数最多的K个IP

LeetCode刷题总结(基础篇)

≡放荡痞女 提交于 2019-12-08 07:22:12
概述 最近刷了一些LeetCode题,都是比较简单的基础题,给出这段时间刷题的一些总结,都是比较基础的东西,仅供刚开始刷题的同学们参考。 总结 HashMap中的containsKey是将key直接进行hash,从连续的存储单元中找到指定下标。 注意Integer整型的溢出,可以根据同号相加为异号判断溢出。 最长公共前缀——找到最短的String、将该String设置为前缀、遍历strs数组,若都有该前缀则返回,若没有则将前缀的lenth-1。 使用链表时最好创建有头结点的链表。 构建字符串使用StringBuilder,int转string使用String.valueOf。 动态规划使用递归的复杂度为2的n次方,因为有些计算会重复进行多次。可以考虑使用map对计算结果进行存储(填表),为了进一步优化空间复杂度,可以使用迭代的方式替换递归的方式。 比较大小用Math.max。 时间复杂度为对数形式时考虑使用了二分法。 若要交换两个输入数据,可以通过调用自身方法来实现。 在树的递归过程中,子树的判空尽量不要在操作父节点时通过root.left!=null判空,而应该直接在递归操作子树时通过root!=null判空。 使用List更加耗费时间,因此能用数组尽量用数组,可以在程序的最后,根据需要将数组转化成List返回。 异或是个好东西。 位运算是个好东西,例如h&(2的n次方-1)和h

一致性hash算法--负载均衡

試著忘記壹切 提交于 2019-12-06 21:07:38
有没有好奇过redis、memcache等是怎么实现集群负载均衡的呢? 其实他们都是通过一致性hash算法实现节点调度的。 讲一致性hash算法前,先简述一下求余hash算法: hash(object)%N 一个缓存服务器宕机了,这样所有映射到这台服务器的对象都会失效,我们需要把属于该服务器中的缓存移除,这时候缓存服务器是 N-1 台,映射公式变成了 hash(object)%(N-1) ; 由于QPS升高,我们需要添加多一台服务器,这时候服务器是 N+1 台,映射公式变成了 hash(object)%(N+1) 。 1 和 2 的改变都会出现所有服务器需要进行数据迁移。 一致性HASH算法 一致性HASH算法的出现有效的解决了上面普通求余算法在节点变动后面临全部缓存失效的问题:   type Consistent struct {    numOfVirtualNode int   hashSortedNodes [] uint32    circle map[ uint32] string    nodes map[ string] bool } 简单地说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某空间哈希函数H的值空间是0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间如下: 下一步将各个服务器使用哈希算法计算出每台机器的位置

Bugku md5 collision

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 13:23:44
题目名字都叫 md5 碰撞,那就肯定和 md5 碰撞脱不了关系了 打开题目,首先让我们输入 a 行吧,随意 post 一个 a=1 进去 结果提示 flase 这里应该是有特殊值,我们找找看 查看源码,抓包 没找到 试试全局变量 object 。。。失败 回想下题目名字, md5 碰撞,这里一定就和 md5 碰撞相关了,所以我们将 object 进行 md5 加密传入试试。。。。失败 然后去百度上找了下 md5 碰撞相关内容 解释是: PHP 在处理哈希字符串时,会利用 ”!=” 或 ”==” 来对哈希值进行比较,它把每一个以 ”0E” 开头的哈希值都解释为 0 ,所以如果两个不同的密码经过哈希以后,其哈希值都是以 ”0E” 开头的,那么 PHP 将会认为他们相同,都是 0 。 攻击者可以利用这一漏洞,通过输入一个经过哈希后以 ”0E” 开头的字符串,即会被 PHP 解释为 0 ,如果数据库中存在这种哈希值以 ”0E” 开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。 原文链接: https://blog.csdn.net/qq_30464257/article/details/81432446 所以我们这里也就随意使用 0e 开头的科学计数法字符串的 md5 加密字符串来传入就可以伪造正确的值了 http://123.206.87.240:9009/md5

第3篇:分布式数据库存储

只谈情不闲聊 提交于 2019-12-06 11:56:58
一、分布式数据库存储 在前面的章节;GreenPlum数据库是分布式架构数据库;表的数据分布在segment节点。那么表的数据根据什么策略来分布的? GreenPlum数据库性能依赖于跨数据节点均匀分布 GreenPlum数据库查询响应时间由所有数据节点完成时间来度量。系统只能跟最慢数据节点完成时间来决定。如果数据存储倾斜。一个数据节点比其他节点需要花更多的时间来处理数据,数据存储倾斜只会存在哈希分布的情况。 在GreenPlum数据库中;表关联查询最常见。若两个或者多个表关联的字段非分布键或者采用随机分布。在其他分布式架构这表之间的关系不是亲和表。要执行连接,匹配的行必须位于同一节点上。 如果数据未在同一连接列上分发,则其中一个表所需的行将动态重新分发到其他节点。 有些情况下,执行广播动作,每个节点将其各个行发送到所有其他节点上,而不是每个节点重新哈希数据并根据哈希值将行发送到适当的节点的重新分配。 是不是还有一种复制表?在GreenPlum6.0以上的版本支持复制表。正好避免2中的广播或者重分布动作。 二、分布策略 在GreenPlum数据库在创建表时可以指定分布策略:哈希分布( DISTRIBUTED BY )、随机分布( DISTRIBUTED RANDOMLY) 、复制分布 (DISTRIBUTED REPLICATED )。 哈希分布:需要指定分布键

python类型-集合

送分小仙女□ 提交于 2019-12-06 11:03:28
集合类型 集合对象是一组无序排列的可哈希的值,集合成员可以做字典的键。集合有两种类型:可变集合,可以添加和删除元素,可变集合不是可哈希的,不能用作字典的键也不能作为其它集合中的元素;不可变集合相反,有哈希值,可用作字典的键或作为集合中的一个成员。 创建集合类型和给集合赋值 集合创建的唯一方法-用集合的工厂方法set()和frozenset() >>> s = set('cheeseshop') >>> s set(['c', 'e', 'h', 'o', 'p', 's']) >>> t = frozenset('bookshop') >>> t frozenset(['b', 'h', 'k', 'o', 'p', 's']) >>> type(s) <type 'set'> >>> len(s) 6 >>> len(t) == len(s) True >>> s == t False 访问集合中的值 可以遍历查看集合成员或检查某项元素是否是一个集合中的成员。 >>> s set(['c', 'e', 'h', 'o', 'p', 's']) >>> 'k' in s False >>> for i in s: ... print i, ... c e h o p s 更新集合 用各种集合内建的方法和操作符添加和删除集合的成员。 >>> s set(['c', 'e', 'h',

mysql在B-Tree上创建伪哈希索引

守給你的承諾、 提交于 2019-12-06 10:46:20
构建哈希的过程 select过程 长字符串下,构建索引可通过自定义哈希作为索引,本人通过实验,在3百多个数据记录的下,性能效果很明显,完全不是一个等级.以下为索引前后几种情况对比 无索引的url:直接通过无索引url 通过构建url的哈希索引:用bigint类型存储索引字段crc_url 在哈希索引下,几乎都是0秒完成. 当然,如果直接使用url作为索引,即用B-Tree存储url存储的内容会很大. 题外话: 在where字句中,优化器会根据查询条件是否存在索引,优先进行索引查询. 如下为例子: 将无索引的url放在前面,跟放在后面,效果是一样的 来源: https://www.cnblogs.com/listened/p/11978829.html

长文本去重缘起: (1)原创不易,互联网抄袭成风,很多原创内容在网上被抄来抄去,改来改去 (2)

你说的曾经没有我的故事 提交于 2019-12-06 09:43:00
缘起: (1)原创不易,互联网抄袭成风,很多原创内容在网上被抄来抄去,改来改去 (2)百度的网页库非常大,爬虫如何判断一个新网页是否与网页库中已有的网页重复呢? 这是本文要讨论的问题(尽量用大家都能立刻明白的语言和示例表述)。 一、传统签名算法与文本完整性判断 问题抛出: (1)运维上线一个bin文件,将文件分发到4台线上机器上,如何判断bin文件全部是一致的? (2)用户A将消息msg发送给用户B,用户B如何判断收到的msg_t就是用户A发送的msg? 思路: 一个字节一个字节的比对两个大文件或者大网页效率低,我们可以用一个签名值(例如md5值)代表一个大文件,签名值相同则认为大文件相同(先不考虑冲突率) 回答: (1)将bin文件取md5,将4台线上机器上的bin文件也取md5,如果5个md5值相同,说明一致 (2)用户A将msg以及消息的md5同时发送给用户B,用户B收到msg_t后也取md5,得到的值与用户A发送过来的md5值如果相同,则说明msg_t与msg相同 结论:md5是一种签名算法,常用来判断数据的完整性与一致性 md5设计原则:两个文本哪怕只有1个bit不同,其md5签名值差别也会非常大,故它只适用于“完整性”check,不适用于“相似性”check。 新问题抛出: 有没有一种签名算法,如果文本非常相似,签名值也非常相似呢? 二、文本相似性的签名算法

Redis Cluster

陌路散爱 提交于 2019-12-06 03:45:06
Redis Cluster 呼唤集群 数据分布 搭建集群 集群伸缩 客户端路由 集群原理 故障转移 开发运维常见问题 呼唤集群 1. 并发量 2. 数据量 3. 网络流量 解决办法 分布式:简单的认为加机器 集群:规模化需求 并发量:OPS 数据量:”大数据” 数据分布 分布式数据库-数据分区 顺序分区和哈希分区 顺序分布 哈希分布(例如节点取模) 数据分布对比 分布方式 特点 典型产品 哈希分布 数据分散度高、键值分布业务无关、无法顺序访问、支持批量操作 一致性哈希Memcache、Redis Cluster、其他缓存产品 顺序分布 数据分散度易倾斜、键值业务相关、可顺序访问、支持批量操作 Big Table、HBase 哈希分布 节点取余分区 一致性哈希分区 虚拟槽分区 多倍扩容 客户端分片:哈希+取余 节点伸缩:数据节点关系变化,导致数据迁移 迁移数量和添加节点数量有关:建议翻倍扩容 一致性哈希 扩容 客户端分片:哈希+顺时针(优化取余) 节点伸缩:只影响邻近节点,但是还是有数据迁移 翻倍伸缩:保证最小迁移数据和负载均衡 虚拟槽分区 预设虚拟槽:每个槽映射一个数据子集,一般比节点数大 良好的哈希函数:例如CRC16 服务端管理节点、槽、数据:例如Redis Cluster 搭建集群-基本架构 单机架构 分布式架构 Redis Cluster架构 节点 meet 指派槽 复制

分布式基础知识

…衆ロ難τιáo~ 提交于 2019-12-05 21:36:38
分布式基础知识 https://www.cnblogs.com/zhang-qc/p/8687663.html 参考 https://github.com/CyC2018/Interview-Notebook/blob/master/notes/ 基本概念 (1)异常: 1. 服务器宕机   内存错误、服务器停电等都会导致服务器宕机,此时节点无法正常工作,称为不可用。   服务器宕机会导致节点失去所有内存信息,因此需要将内存信息保存到持久化介质上。 2. 网络异常   有一种特殊的网络异常称为 网络分区 ,即集群的所有节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信。 3. 磁盘故障   磁盘故障是一种发生概率很高的异常。   使用冗余机制,将数据存储到多台服务器。 (2)超时:   可以将服务器的操作设计为具有 幂等性 ,即执行多次的结果与执行一次的结果相同。如果使用这种方式,当出现超时的时候,可以不断地重新请求直到成功。 (3)衡量指标 1. 性能   常见的性能指标有:吞吐量、响应时间。这两个指标往往是矛盾的,追求高吞吐的系统,往往很难做到低响应时间。   高吞吐意味并发系统,高并发提高 CPU 资源的利用率,但是请求不能马上被处理,需要和其它请求一起进行并发处理,响应时间增高。 2. 可用性:指系统在面对各种异常时可以提供正常服务的能力 3. 一致性