哈希

Elasticsearch - 倒排索引原理

半城伤御伤魂 提交于 2019-11-28 19:02:29
关于es为什么搜索快,大家应该有所了解,但是到底什么是倒排索引?网上找到一篇介绍通俗易懂,转载如下:   见其名知其意,有倒排索引,对应肯定,有正向索引。 正向索引(forward index),反向索引(inverted index)更熟悉的名字是倒排索引。 在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词ID)。例如“文档1”经过分词,提取了20个关键词,每个关键词都会记录它在文档中的出现次数和出现位置。 得到正向索引的结构如下: “文档1”的ID > 单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表;…………。 “文档2”的ID > 此文档出现的关键词列表。   一般是通过key,去找value。 当用户在主页上搜索关键词“华为手机”时,假设只存在正向索引(forward index),那么就需要扫描索引库中的所有文档,找出所有包含关键词“华为手机”的文档,再根据打分模型进行打分,排出名次后呈现给用户。因为互联网上收录在搜索引擎中的文档的数目是个天文数字,这样的索引结构根本无法满足实时返回排名结果的要求。 所以,搜索引擎会将正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射,每个关键词都对应着一系列的文件,这些文件中都出现这个关键词。

flask项目--认证方案JWT

泄露秘密 提交于 2019-11-28 16:03:24
1. jwt 对比状态保持机制 APP不支持状态保持 状态保持有同源策略, 默认无法跨服务器传递(nginx可以处理) JWT不会对数据进行加密, 所以数据中不要存放有阅读价值的数据 不可逆加密 md5 sha1 sha256 主要用于数据认证, 防止数据被修改 消息摘要 MD 通过哈希算法将任意长度内容转为定长内容, 且相同内容的哈希值始终相同, 不同内容的哈希值不同(极小概率出现碰撞) 由于其唯一性, 一般将数据的哈希值称为数据的摘要信息, 称为数据的"指纹", 用于检测数据是否被修改 代表算法 sha1 sha256 md5 缺点 哈希算法是公开的, 如果可以获取到明文, 就可以穷举出使用的算法 消息认证 MA 哈希算法基础上混入秘钥, 防止哈希算法被破解, 避免签名被伪造 代表算法 hmacsha256 JWT一般会采用 消息认证 机制` 2. PyJWT (重点) 安装 pip install PyJWT 3. 数字签名 (拓展) 消息认证存在缺点 之前没有对服务器返回的数据进行验签, 无法确认数据是否被修改(服务器身份是否合法) 将秘钥交给客户端, 客户端才可以验签服务器返回的数据是否被修改 但是客户端安全性较差, 一旦秘钥泄露, 仍然可以伪造签名 利用非对称加密对摘要信息进行加密, 避免摘要信息被伪造 非对称加密采用秘钥对 公钥和私钥 公钥加密, 私钥解密 私钥加密,

分布式系统中一致性哈希算法

送分小仙女□ 提交于 2019-11-28 14:03:44
分布式系统中一致性哈希算法 此博文转载自 分布式系统中一致性哈希算法 ,博主对分布式系统中最常见的一致性哈希算法进行了非常细致的讲解,非常值得阅读!另外博主在博客园上定制的皮肤样式也是非常好看,推荐一波~ 业务场景 近年来,由于互联网的兴起,B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行起来。分布式系统相对于单一系统而言,带来了流量大、系统高可用和高容错的便利。功能强大的同时,也意味着实现起来需要更多的技术支持。例如系统访问层的 负债均衡 、缓存层的 多实例主从复制备份 以及数据层的 分库分表 等。 我们以负载均衡为例,常见的负载均衡方法有很多,但是它们的优缺点都很明显: 随机访问策略: 系统随机访问,缺点:可能造成服务器负载压力不均衡,俗话讲就是撑的撑死,饿的饿死。 轮询策略: 请求均匀分配,如果服务器有性能差异,则无法实现性能好的服务器能够多承担一部分。 权重轮询策略: 权值需要静态配置,无法自动调节,不适合对长连接和命中率有要求的场景。 Hash取模策略: 不稳定,如果列表中某台服务器宕机,则会导致路由算法产生变化,由此导致命中率的急剧下降。 一致性哈希策略(本文重点分析) 以上几个策略,排除本篇介绍的一致性哈希策略,可能使用最多的就是 Hash取模策略 了。Hash取模策略的缺点也是很明显的,这种缺点也许在负载均衡的时候不是很明显

ansible笔记(14):变量(三)

巧了我就是萌 提交于 2019-11-28 13:09:28
一、注册变量(register)       ansible的模块在运行之后,其实都会返回一些“返回值”,只是默认情况下,这些“返回值”并不会显示而已,我们可以把这些返回值写入到某个变量中,这样我们就能够通过引用对应的变量从而获取到这些返回值了, 这种将模块的返回值写入到变量中的方法被称为“注册变量” ,那么怎样将返回值注册到变量中呢?我们来看一个playbook示例: --- - hosts: 192.168.10.3 remote_user: root tasks: - name: test shell shell: "echo test > /test/testfile" register: testvar - name: shell moudule return values debug: var: testvar 上例中共有两个任务,第一个任务使用shell模块在192.168.10.3主机中创建了一个测试文件 /test/testfile,将字符“test&”输入到了测试文件中,然后使用“register”关键字将当前shell任务的返回值写入了名为“testvar”的变量中,第二个任务使用debug模块输出了第一个任务中的注册变量的值,没错,注册变量就是这么简单,使用register关键字指定对应的变量名即可。 上述playbook执行后,可以在控制台中看到名为“

为什么要重写 hashcode 和 equals 方法?

坚强是说给别人听的谎言 提交于 2019-11-28 11:04:04
引言 以前面试的时候被面试官问到过这样一个问题: 你有没有重写过 hashCode 方法? 心里想着我没事重写哪玩意干啥,能不写就不写。嘴上当然没敢这么说,只能略表遗憾的说抱歉,我没写过。 撇了面试官一眼,明显看到他对这个回答不满意,但是这已经触及到我的知识盲点了,我也很惭愧,可是确实没有重写过,咱也不能胡扯不是。 然后他又问到另外一个问题: 你在用 HashMap 的时候,键(Key)部分,有没有放过自定义对象? 我说我放过,很自信的说我放过(其实我忘了我有没有放过),但是不能怂啊,第一个都不会了,第二个再说不会哪不是直接拜拜要走人了吗? 面试官狡猾的笑了,说是你既然没有重写过 hashCode 方法,你怎么把自定义对象放进去的? 我勒个去,原来你在这等着我呢,没想到这还是个连环炮,惹不起惹不起,认怂三连 不过不会就学,不懂就问,这一直都是咱程序猿优秀的素养,今天就干脆从 Hash 表学起,讲述 HashMap 的存取数据规则,由此来搞定上述问题的答案。 通过 Hash 算法来了解 HashMap 对象的高效性 我们先复习数据结构里的一个知识点: 在一个长度为 n(假设是100)的线性表(假设是 ArrayList)里,存放着无序的数字;如果我们要找一个指定的数字,就不得不通过从头到尾依次遍历来查找,这样的平均查找次数是 n / 2(这里是50)。 我们再来观察 Hash 表

列表 元组 字典

女生的网名这么多〃 提交于 2019-11-28 10:58:08
列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作。 Python列表方法 list.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。 >>> a.append(3) >>> a [1, 2, 3] list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于 a[len(a):] = L。 >>> b=[7,8,9] >>> a.extend(b) >>> a [1, 2, 3, 5, 7, 8, 9] list.insert(i, x) 在指定位置插入一个元素。例如 a.insert(0, x) 会插入到整个列表之前 >>> a.insert(0,111) >>> a [111, 1, 2, 3, 5, 7, 8, 9] list.remove(x) 删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。 >>> a.remove(7) >>> a [111, 1, 2, 3, 5, 8, 9] list.pop([i]) 从列表的指定位置删除元素,并将其返回。如果没有指定索引,a.pop() 返回最后一个元素。 >>> a.pop() #删除最后一个元素 9 >>> a [111, 1, 2, 3, 5, 8] >>> a.pop(4) #

内置函数:内存相关id,hash

爷,独闯天下 提交于 2019-11-28 10:23:32
id:查看变量的内存地址 a = {} print(id(a)) hash:可变数据类型不可哈希,不可变数量类型可哈希 可哈希数据类型调用hash函数返回一个哈希值,不可哈希调用hash函数会报错 i = [0,1,2] l = (0,1,2) k = l # print(hash(i))#报错 print(hash(l))#返回一个哈希值 print(hash(k))#内容相同的变量,同一次执行下,哈希值不变 来源: https://www.cnblogs.com/aizhinong/p/11404665.html

常见的查找算法(七):哈希查找

倖福魔咒の 提交于 2019-11-28 05:58:16
散列表 ( Hash table ,也叫 哈希表 ),是根据 键 (Key)而直接访问在内存存储位置的 数据结构 。也就是说,它通过计算一个关于键值的函数,将所需查询的数据 映射 到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做 散列函数 ,存放记录的数组称做 散列表 。 散列函数 的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。 直接定址法 :取关键字或关键字的某个线性函数值为散列地址。即 hash(k) = k 或 hash(k) = a · k + b,其中a、b 为常数(这种散列函数叫做自身函数) 数字分析法 :假设关键字是以 r 为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。 平方取中法 :取关键字平方后的中间几位为哈希地址。通常在选定哈希函数时不一定能知道关键字的全部情况,取其中的哪几位也不一定合适,而一个数平方后的中间几位数和数的每一位都相关,由此使随机分布的关键字得到的哈希地址也是随机的。取的位数由表长决定。 折叠法 :将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。 随机数法 除留余数法 :取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 hash(k) =

Redis快速入门及使用

♀尐吖头ヾ 提交于 2019-11-28 04:20:15
原文: Redis快速入门及使用 概述 redis是一种支持分布式的nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。 redis文档: http://redisdoc.com/index.html Redis使用场景 登录会话存储:存储在redis中,与memcached相比,数据不会丢失。 排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。 作为消息队列:比如celery就是使用redis作为中间人。 当前在线人数:当前系统有多少在线人数。 一些常用的数据缓存:比如我们的BBS论坛,板块不会经常变化的,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。 把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。 好友关系:微博的好友关系使用redis实现。 发布和订阅功能:可以用来做聊天软件。

linux基础命令:MD5sum

青春壹個敷衍的年華 提交于 2019-11-28 03:18:58
在Linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。md5sum是一种计算机程序,用于计算与校验RFC 1321所描述的128位MD5哈希值,此处MD5散列值(或校验和)作一个文件的数字指纹使用。 两个不同的文件几乎不可能有相同的MD5哈希值,除非其创建便是刻意为之。一般来说,任何对一个文件的非恶意变更都会导致其MD5哈希值改变, 因此md5sum一般用于检查文件完整性,尤其常用于检测在文件传输、磁盘错误或其他无恶意涉入的情况下文件的正确性。 1、使用md5sum来产生指纹(报文摘要)命令如下: md5sum filename > filename.md5 或者 md5sum filename >>filename.md5 也可以把多个文件的报文摘要输出到一个md5文件中,这要使用通配符*,比如某目录下有几个iso文件,要把这几个iso文件的摘要输出到iso.md5文件中,命令如下: md5sum *.iso > iso.md5 2、使用md5报文摘要验证文件,方法有二: 把下载的文件file和该文件的file.md5报文摘要文件放在 同一个目录 下,然后用如下命令进行验证: md5sum -c file.md5 然后如果验证成功,则会输出:正确 例子:计算校验值并输出至hash.md5 $ md5sum filetohashA.txt