哈希

老司机带你检测相似图片

跟風遠走 提交于 2020-01-12 07:41:25
欢迎大家前往 腾讯云技术社区 ,获取更多腾讯海量技术实践干货哦~ 作者: 雷经纬 导语 本文从从图片的dhash,ahash,phash,颜色分布向量到基于语义的sift,surf,gist特征,构建一套分层相似图片检测系统。本文致力于零基础单机快速搭建一个可用的相似图片识别系统。 1 背景 相似图片检测的定义是人眼看起来像,比如下面的俩图。 相似图片的检测广泛用于图片去重,仿冒图标检测,图片检索等。本文也是基于图标相似检测的需求去做的,本意是用于打假。然而专家老中医告诉我,打假不如推荐相似app受市场欢迎,并且不同应用场景下我们做事的思路也会不同。不管了,先把相似图片识别出来 2 检测的原理 图片相似检测无非是提取图片某个维度的特征,根据算法两两计算相似度。(基于机器学习,深度学习的方法则会先构建一个模型,然后将新样本特征输入模型即可。)简单流程可以描述为: 检测过程中可能用到的7个基础特征如下: 简单解释下,dhash,ahash,phash是根据基于分块等某种算法得到的基于图片RGB值的某个哈希(其详细描述可参考 http://itindex.net/detail/42723 );RGB向量则是将色彩从256 256 256映射到较小的区间如4 4 4,然后计算图片在每个区间的分布形成一个数组; SIFT,SURF,GIST则不再是RGB值的某种统计

Blackchain--about tree

冷暖自知 提交于 2020-01-10 23:58:59
In BC About Tree Structure 1.The Merkle Hash Tree. 验证一组数据值的简单解决方案的改进是Merkle哈希树(参见图1) ,第一次由[1]提出。它解决了最简单的形式的查询认证问题的点查询和数据集查询,可以适合主内存。Merkle哈希树是一棵二叉树,其中每个叶子包含一个数据值的哈希,每个内部节点包含其两个子节点的级联的哈希。数据值的验证是基于树根的哈希值是真实发布的(真实性可以通过数字签名来建立)。为了证明任何数据值的真实性,验证程序所要做的就是除了数据值本身之外,还向验证程序提供存储在从树的根到该值的路径的同级中的值。通过迭代计算树上所有适当的散列,在末尾可以简单地检查他为根计算的散列是否与真实发布的值匹配。 Merkle哈希树的安全性是基于所使用的哈希函数的抗碰撞性 :恶意验证器伪造数据值在计算上是不可行的,因为这需要在树的某个地方找到一个散列冲突(因为根保持不变,叶子是不同。因此,在两者之间一定有一个碰撞)。因此,可以以提供和计算 log2nlog_{2^n} 来源: CSDN 作者: YSS_33521 链接: https://blog.csdn.net/YSS_33521/article/details/103836708

工作量证明及哈希算法

你。 提交于 2020-01-10 02:50:13
什么是工作量证明: 1、工作的结果作为数据加入区块链成为一个区块 2、完成这个工作的人会获得奖励(这也就是通过挖矿获得比特币) 3、整个“努力工作并进行证明”的机制,就叫工作量证明 为什么采用哈希算法: 1、不可逆:无法从一个哈希值恢复原始数据,哈希并不是加密 2、唯一性:对于特定的数据,只能有一个哈希值,并且这个哈希值是唯一的 3、防篡改:改变输入数据中的一个字节,导致输出一个完全不同的哈希 哈希算法特征: 1、正向快速:给定明文和hash算法,在有限时间和有限资源内能计算出hash值 2、逆向困难:给定hash值,在有限时间内很难逆推出明文 3、输入敏感:原始输入信息修改一点信息,产生的hash值会有很大的不同 4、冲突避免:很难找到两段内容不同的明文,使得他们的hash值一致(发生冲突) main.go package main import ( "core" "fmt" "strconv" ) func main() { bc := core.NewBlockChain() bc.AddBlock("Send 1 BC to Ivan") bc.AddBlock("Send more BC to Ivan") for _,block := range bc.Blocks { fmt.Printf("Prev hash: %x\n", block.PrevBlockHash)

数据结构-08-集合(Set)-哈希表(Hash)-图(Map)

被刻印的时光 ゝ 提交于 2020-01-09 23:27:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ##Set Set 是一种用于保存 不重复元素 的数据结构。常被用作测试归属性,故其查找的性能十分重要。 Set 是python自带的基本数据结构, 有多种初始化方式。 Python的set跟dict的Implementation方式类似, 可以认为set是只有key的dict. s = set() s1 = {1, 2, 3} s.add('shaunwei') 'shaun' in s # return true s.remove('shaunwei') ##Map - 哈希表 Map 是一种 关联数组 的数据结构,也常被称为字典或键值对。 在 Python 中 dict(Map) 是一种基本的数据结构。 # map 在 python 中是一个keyword hash_map = {} # or dict() hash_map['shaun'] = 98 hash_map['wei'] = 99 exist = 'wei' in hash_map # check existence point = hash_map['shaun'] # get value by key point = hash_map.pop('shaun') # remove by key, return value keys =

mysql数据库索引如何做?

跟風遠走 提交于 2020-01-09 16:26:45
MySQL索引底层的实现,今天简单聊一聊,少讲“是怎么样”,更多说说“为什么设计成这样”。 问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类,三楼放IT类… (2)IT类,又分软件类,硬件类… (3)软件类,又按照书名音序排序… 以便快速找到一本书。 与之类比,数据库存储了1000W条数据,要从中找到name=”shenjian”的记录,一条条查,要查到什么时候去? 于是,要有索引,用于提升数据库的查找速度。 问题2. 哈希(hash)比树(tree)更快,索引结构为什么要设计成树型? 加速查找速度的数据结构,常见的有两类: (1)哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1); (2)树,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n)); 可以看到,不管是读请求,还是写请求,哈希类型的索引,都要比树型的索引更快一些,那为什么,索引结构要设计成树型呢? 画外音:80%的同学,面试都答不出来。 索引设计成树形,和SQL的需求相关。 对于这样一个单行查询的SQL需求: select * from t where name=”shenjian”; 确实是哈希索引更快,因为每次都只查询一条记录。

java集合问题篇

此生再无相见时 提交于 2020-01-09 04:02:14
java集合问题篇 ● 请解释为什么集合类没有实现Cloneable和Serializable接口? Java集合必会14问(精选面试题整理) HashMap的put方法的具体流程? hashmap如何扩容 hashmap是如何解决hash冲突的 ● 请解释为什么集合类没有实现Cloneable和Serializable接口? Java集合必会14问(精选面试题整理) Java集合必会14问(精选面试题整理) HashMap的put方法的具体流程? 首先判断数组是否为空(为空就初始化数组),不空----》key是否为空(空:将null插入到数组的0号位置),不空—》根据key算出hash值,再根据hash值算出将要插入的数组的下标【(数组长度-1)&hashcode】,如果该位置有元素了,则将该元素和要插入的元素进行比较(先比较hash,再比较key,相同,则覆盖其value,不同,则jdk1.7使用头插法将添加的元素加入到链表头,然后将链表下移。jdk1.8是使用尾插法。【1.8由于使用了红黑树,总是要遍历链表的,所以直接将其放入尾部】)插入元素后,计数变量:size++ hashmap如何扩容 初始化hashmap的时候会有默认的数组长度16,加载因子3/4,此时阈值为16 3/4=12; 当元素超过12个时就会进行扩容。新数组长度是16 2=32,阈值是32*3/4=24

Redis分区

僤鯓⒐⒋嵵緔 提交于 2020-01-08 14:41:38
数据是怎样分布在多个Redis实例上的 分区是将你的数据分布在多个Redis实例上,以至于每个实例只包含一部分数据。 为什么分区是有用的呢 Redis分区有两个主要目标: 它允许更大的数据库,用许多计算机的内存总和。如果不进行分区,你将会受限于单台计算机的内存。 它允许将计算能力扩展到多核和多台计算机,将网络带宽扩展到多台计算机和网络适配器。 假设我们有4个Redis实例(R0, R1, R2, R3),其上有许多代表用户的key,比如user:1, user:2, ... 等等,那么在存储一个key的时候我们有多种方式。 最简单的一种方式是按照范围分区,即根据对象的映射范围将数据分配到指定的Redis实例上。例如,我们规定ID为0~10000的就分到R0,10001~20000到R1,以此类推。这种方式是可以的,但是有一个缺点是需要一张表来维护这个映射关系。这个表需要管理起来,而且每一个key都需要一个这样的表,因此Redis中的范围分区通常是不受欢迎的,因为它比其他分区方法效率低得多。 除了范围分区以外,另一种方法是 哈希分区 ( hash partitioning ): 第1步、取key,并应用哈希函数将其转换为一个数。例如,如果key是foobar,哈希函数式crc32,那么crc32(foobar)将输出93024922。 第2步、对这个数字使用模运算(取模

【原创】够强!一行代码就修复了我提的Dubbo的Bug。

£可爱£侵袭症+ 提交于 2020-01-08 00:01:19
这是 why 技术的第 28 篇原创文章 之前在 《Dubbo 一致性哈希负载均衡的源码和 Bug,了解一下?》中写到了我发现了一个 Dubbo 一致性哈希负载均衡算法的 Bug。 对于解决方案我是这样写的: 特别简单,把获取identityHashCode的方法从System.identityHashCode(invokers)修改为invokers.hashCode()即可。此方案是我提的issue里面的评论,这里System.identityHashCode和 hashCode之间的联系和区别就不进行展开讲述了,不清楚的大家可以自行了解一下。 我说: 这里 System.identityHashCode 和 hashCode 之间的联系和区别就不进行展开讲述了,不清楚的大家可以自行了解一下。 但是有读者在后台问我详细原因,我已经和他聊清楚了。 再加上这个 BUG 已于近期修复了,且只用了一行代码就修复了 ,那我就写一下解决方案,以及背后的原理。 即是对之前文章的一个补充,也是一个独立的知识点。 所以本文主要是回答下面这三个问题: 1.什么是 System.identityHashCode? 2.什么是 hashCode? 3.为什么一行代码就修复了这个 BUG? 注:本文 Dubbo 源码 2.7.4.1 版本。如果阅读过 《Dubbo 一致性哈希负载均衡的源码和 Bug

Map

久未见 提交于 2020-01-07 21:20:58
Hashtable、HashMap、TreeMap有何不同 HashTable是一个早期的集合类型,所以在继承扩展上是有区别的。 大部分使用Map的场景,通常就是放入、访问或者删除,而对顺序没有特别要求,HashMap在这种情况下基本是最好的选择。HashMap的性能表现非常依赖于哈希码的有效性,请务必 掌握hashCode和equals的一些基本约定,比如: 1.equals相等的对象,hashCode也一定相等。因为我们是我们是通过hash得到对象所在的“链表节点”,然后再进行equals对比的,所以相同的hashCode不一定equals相等,但是反之必然。实际上来讲,单纯的hash不满足很多业务需求,因此扩展出了一种一致性哈希,这个在外文翻译里有一篇。 https://medium.com/ably-realtime/how-to-implement-consistent-hashing-efficiently-fe038d59fff2 2.重写了hashCode也一定要重写equals,实际上不建议自己重写,因为并非比较简单的事情。 3.hashCode需要保持一致性,状态改变返回的哈希值仍然要一致。 4.equals的一些对称反射传递特性 TreeMap和LinkedHashMap保证存放顺序是不同的 public class LinkedHashMapTest {

一致性哈希算法

↘锁芯ラ 提交于 2020-01-07 17:05:32
一致哈希算法 Consistent Hashing 标签(空格分隔): Java基础 1.场景描述(分布式缓存问题) 有三台缓存服务器sever1,server2,server3,如何读写呢?有如下方法 随机访问 哈希计算(取模法) 一致性哈希 随机访问 每次请求随机发送到一台缓存服务器,策略简单但是会导致问题: 同一份数据可能被存在不同的机器上造成数据冗余 数据已有缓存,但是没有命中 所以,随机策略在时间效率、空间效率上都不是很好。 哈希计算(取模法) 解决相同key访问发送到同一服务器的常用方法->计算哈希。如下 server=Hash(key)%3 这样会解决随机访问导致的问题。但是有产生了新的问题: 容错性:系统中有服务器不可用时,整个系统是否可正确高效运行 扩展性:加入新的服务器,整个系统是否可正确高效运行 假设现在有一台机器宕机了,那么之前的算法就要改为 server=Hash(key)%(N-1) 增加一台服务器,则变为 server=Hash(key)%(N+1) 这会导致无论是增加还是减少服务器都会从新计算Hash。从而导致缓存不命中问题。 一致性哈希 分布式系统每个节点都可能失效,在节点失效或者加入新节点后,如何把对数据的影响降到最低?在分布式缓存中,如果没有好的算法,某个节点失效或者加入新节点后,会对当前缓存的命中率产生巨大的影响。 传统Hash也不是最优解