hash

大数据算法——布隆过滤器

狂风中的少年 提交于 2020-02-15 09:49:18
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天的文章和大家一起来学习大数据领域一个经常用到的算法——布隆过滤器。如果看过《数学之美》的同学对它应该并不陌生,它经常用在集合的判断上,在海量数据的场景当中用来快速地判断某个元素在不在一个庞大的集合当中。它的原理不难,但是设计非常巧妙,老实讲在看《数学之美》之前,我也没有听说过这个数据结构,所以这篇文章也是我自己学习的笔记。 原理 在我之前的理解当中,如果想要判断某个元素在不在集合当中,经典的结构应该是平衡树和hash table。但是无论是哪一种方法,都逃不开一点,都需要存储原值。 比如在爬虫场景当中,我们需要记录下之前爬过的网站。我们要将之前的网址全部都存储在容器里,然后在遇到新网站的时候去判断是否已经爬过了。在这个问题当中,我们并不关心之前爬过的网站有哪些,我们只关心现在的网站有没有在之前出现过。也就是说之前出现过什么不重要,现在的有没有出现过才重要。 我们利用平衡树或者是Trie或者是AC自动机等数据结构和算法可以实现高效的查找,但是都离不开存储下所有的字符串。想象一下,一个网址大概上百个字符,大约0.1KB,如果是一亿个网址,就需要10GB了,如果是一百亿一千亿呢?显然这么大的规模就很麻烦了,今天要介绍的布隆过滤器就可以解决这个问题,而且不需要存储下原值,这是一个非常巧妙的做法,让我们一起来看下它的原理。

集合知识点

≯℡__Kan透↙ 提交于 2020-02-15 01:47:22
HashMap底层 1.8前数组+链表 1.8后数组+链表/红黑树 当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。 负载因子 HashMap所能容纳的最大数据量=length*负载因子(默认是0.75) 超过这个数目就要进行扩容(resize),扩容后的HashMap容量是之前容量的两倍。 负载因子过小,扩容就会很快,可能内存紧张;负载因子过大,就会扩容慢,造成时间效率低。 HashMap 的长度为什么是2的幂次方 因为hash值很大,能拿来直接用来做数组下标。所以令table数组下标i = (length-1)&hash,length-1后就能保证全为1,与操作之后,能保证散列的均匀,同时与运算效率高。 迭代器 迭代器是一个对象,他的工作是遍历并选择序列中的对象。开发人员不需要知道容器底层结构,就可以实现对容器的遍历。 Iterator只能正向遍历集合,ListIterato继承自Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素修改。

hashTable

£可爱£侵袭症+ 提交于 2020-02-14 23:13:49
六、hashTable 散列表(Hash Table),也叫哈希表,是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说,它通过关键码值映射到表中的一个位置来访问记录,这样我们就可以通过查找关键码值而不需要比较就可获得需要的记录的存储位置。 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key) 存储位置=f(关键字) f为散列函数,又称哈希(hash)函数。 采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或哈希表(Hash Table) 哈希表是由 数组+链表组成 根据关键字查找时,使用hash函数确定存储位置(数组中一个下标),确定下标后,遍历链表找到要索引的结果。数组中存储的是从链表的头结点。 来源: CSDN 作者: Simeon郎 链接: https://blog.csdn.net/dreame_life/article/details/104318039

Difference between CRC and hash method (MD5, SHA1)

倖福魔咒の 提交于 2020-02-14 06:19:08
问题 Both CRC and hash methods can be used to verify the integrity of the original data. Why do most systems uses hash method nowadays? 回答1: CRC was designed to prevent transmission errors, not malicious action. Therefore, it isn't collision resistant. In particular, the linear properties of CRC codes even allow an attacker to modify a message in such a way as to leave the check value unchanged 回答2: HASH methods (ONE WAY ENCRYPTION) are more complex (and powerful) than simple check codes (CRC).

Redis使用

僤鯓⒐⒋嵵緔 提交于 2020-02-14 05:53:05
存储用户信息时 方案一:key-value形式存储,key为用户id,value为用户结构信息序列化后的字符串内容 方案二:hash存储,子key为用户id,value为用户结构信息,无需序列化 方案一在存取时需要序列化与反序列化;且key可不唯一,用户id存储可能重复;并发操作时需要将整个对象取回并对修改操作作并发保护。 方案二可防重,且不存在序列化开销,没有并发修改控制问题 TODO 这里有个问题,网上说hash可以避免cas问题,怎么体现的 分布式锁 用于控制并发流程,如多个线程需要频繁对某个数据进行读取和修改引起的并发问题,使用分布式锁可保证原子操作即执行某一过程不会因线程切换而打断。 实现:setnx(set if not exits)一个时间只允许设置一个锁,用完了del指令释放 setnx lockKey true del lockKey 问题一:如果在获得锁后发生事故导致del指令没能执行,那么会引起死锁问题,锁不能被释放,下一个线程永远拿不到 解决一:在获取锁的同时设置一个过期时间expire lockKey seconds,保证发生异常不能主动释放锁也能自动释放 问题二:虽然设置了过期时间保证自动释放锁,但如果在exprie前服务进程挂了,也是会引起死锁的,因为expire和setnx指令不是原子指令不能一起执行 (TODO 不使用Redis事务的原因) 解决二

Redis(一)基础数据结构

安稳与你 提交于 2020-02-14 05:52:26
1.目录 Redis 基础数据结构 string (字符串) list (列表) hash (字典) set (集合) zset (集合) 容器型数据结构的通用规则 过期时间 2.Redis 基础数据结构 Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集 合)、hash (哈希) 和 zset (有序集合)。 3.string (字符串) 字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一 的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。 不同类型的数据结构的差异就在于 value 的结构不一样。 Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中 所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩 容时一次只会多扩 1M 的空间。 需要注意的是字符串最大长度为 512M。 4.list (列表) Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。 这意味着 list

Java sha加密算法 生成指定位数随机字符串 Ldap中{SSHA}密码加密方式

徘徊边缘 提交于 2020-02-13 22:41:27
public class test01 { public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException { String str= RandomStringUtils.randomAlphanumeric(8); System.out.println(str); String s = generateSSHAPwd(str); System.out.println(s); } /** * Openldap 产生SSHA密码的算法 * 效果等同于 slappasswd -h {ssha} -s password * @param password * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static String generateSSHAPwd(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException { final int SALT_LENGTH = 4; SecureRandom

Python 图片相似度

纵然是瞬间 提交于 2020-02-13 12:55:54
原文: https://www.cnblogs.com/dcb3688/p/4610660.html import cv2 import numpy as np #原文:https://www.cnblogs.com/dcb3688/p/4610660.html # 均值哈希算法 def aHash(img): # 缩放为8*8 img = cv2.resize(img, (8, 8)) # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # s为像素和初值为0,hash_str为hash值初值为'' s = 0 hash_str = '' # 遍历累加求像素和 for i in range(8): for j in range(8): s = s + gray[i, j] # 求平均灰度 avg = s / 64 # 灰度大于平均值为1相反为0生成图片的hash值 for i in range(8): for j in range(8): if gray[i, j] > avg: hash_str = hash_str + '1' else: hash_str = hash_str + '0' return hash_str # 差值感知算法 def dHash(img): # 缩放8*8 img = cv2.resize

HashMap(一)基础入门

人盡茶涼 提交于 2020-02-13 10:58:13
1.数组的优势/劣势 数组的内存空间是连续的 特点:索引速度快 劣势:增加、删除数据时,浪费性能 2.链表的优势/劣势 链表不是连续的内存,每一块内存中有一个引用保存下一个内存的地址。 优势:增加、删除数据时,效率高 劣势:如果要访问最后一个元素,只能从头依次访问每一个内存,查询效率低 3.有没有一种方式整合两种数据的优势? 散列表。 整合了数组的快速索引,和链表的动态扩容 4.什么是哈希? 核心理论:Hash也称散列、哈希,基本理论就是把 任意长度 的输入,通过Hash算法变成 固定长度 的输出。 这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。 Hash的特点: 从hash值不可以反向推导出原始的数据 输入的数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值 哈希算法的执行效率高效,长的文本也能快速计算出哈希值。 hash算法的冲突概率要小 由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。 根据抽屉原理,一定会在不同的输入被映射成相同输出情况。 抽屉原理:桌上有十个苹果 ,要把这十个苹果放到九个抽屉里,无论怎么放,我们会发现至少会有一个抽屉里面放不少于两个苹果。 这一现象就是我们所说的“抽屉原理” 来源: CSDN 作者: 梨子果果哟 链接: https://blog.csdn.net/qq

redis实现电商购物车

邮差的信 提交于 2020-02-12 22:42:56
hash类型数据的基本操作 添加/修改数据 hset key field value 获取数据 hget key field hgetall key 删除数据 hdel key field1 [field2] 添加/修改多个数据 hmset key field1 value1 field2 value2 ... 获取多个数据 hmget key filed1 field2 ... 获取哈希表中字段的数量 hlen key 获取哈希表中是否存在指定的字段 hexists key field hash类型数据扩展操作 获取哈希表中所有的字段名或字段值 hkeys key hvals key 设置指定字段的数值数据增加指定范围的值 hincrby key field increment hincrbyfloat key field increment 注意事项 hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值未nil 每个hash可以存储2^32-1个键值对 hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash的设计初衷不是为存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用 hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低