散列在很多方面是一个微缩版的Redis,不少字符串命令都有相应的散列版本 熟悉文档数据库的读者可以将散列看作是文档数据库里面的文档,而熟悉关系数据库的读者可以将散列看作是关系数据库里面的行。...字符串的优点 虽然散列键命令和字符串键命令在部分功能上有重合的地方,但是字符串键命令提供的操作比散列键命令更为丰富。...比如,字符串能够使用 SETRANGE 命令和 GETRANGE 命令设置或者读取字符 串值的其中一部分,或者使用 APPEND 命令将新内容追加到字符串值的末尾,而散列键并不支持 这些操作 再比如我们要设置键过期时间...当然,用户也可以选择把数据存储在散列中,然后将类似 SETRANG E、GETRANGE 这样的操作交给客户端执行 如果程序需要存储的数据项比较多,并且你希望尽可能地减少存储数据所需的内存,就应该优 先考虑使用散列键...如果多个数据项在逻辑上属于同一组或者同一类,那么应该优先考虑使用散列键 五、使用场景 短网址生成程序 此时我们可以根据该短链接查询到具体的源网址,并记录点击次数 ?
更多配置的含义大家可以去网上查询。 (2)散列算法与加密算法 md5是本文会使用的散列算法,加密算法本文不会涉及。...散列和加密本质上都是将一个Object变成一串无意义的字符串,不同点是经过散列的对象无法复原,是一个单向的过程。...例如,对密码的加密通常就是使用散列算法,因此用户如果忘记密码只能通过修改而无法获取原始密码。但是对于信息的加密则是正规的加密算法,经过加密的信息是可以通过秘钥解密和还原。...经过散列后的密码替换用户注册时的密码,然后将User保存进数据库。剩下的工作就丢给UserService来处理。...那么这样就带来了一个新问题,既然散列算法是无法复原的,当用户登录的时候使用当初注册时的密码,我们又应该如何判断?答案就是需要对用户密码再次以相同的算法散列运算一次,再同数据库中保存的字符串比较。
更多配置的含义大家可以去网上查询。 2、散列算法与加密算法 md5是本文会使用的散列算法,加密算法本文不会涉及。...散列和加密本质上都是将一个Object变成一串无意义的字符串,不同点是经过散列的对象无法复原,是一个单向的过程。...例如,对密码的加密通常就是使用散列算法,因此用户如果忘记密码只能通过修改而无法获取原始密码。但是对于信息的加密则是正规的加密算法,经过加密的信息是可以通过秘钥解密和还原。...经过散列后的密码替换用户注册时的密码,然后将User保存进数据库。剩下的工作就丢给UserService来处理。...那么这样就带来了一个新问题,既然散列算法是无法复原的,当用户登录的时候使用当初注册时的密码,我们又应该如何判断?答案就是需要对用户密码再次以相同的算法散列运算一次,再同数据库中保存的字符串比较。
尽管不能直接把编号作为数组下标,但可以截取编号的后四位作为数组下标,来存取学生信息数据。...当通过编号查询学生信息的时候,用同样的方法,取编号的后四位,作为数组下标,来读取数组中的数据 这就是典型的散列思想。其中,学生的编号叫作键(key)或者关键字。用它来标识一个学生。...当按照键值查询元素时,用同样的散列函数,将键值转化数组下标,从对应的数组下标的位置取数据 散列函数 概念 散列函数,顾名思义,它是一个函数。...对于散列比较均匀的散列函数来说,理论上讲,k=n/m,其中n表示散列中数据的个数,m表示散列表中“槽”的个数 实践 假设我们有10万条URL访问日志,如何按照访问次数给URL排序?...遍历10万条数据,以URL为key,访问次数为value,存入散列表,同时记录下访问次数的最大值K,时间复杂度O(N) 如果K不是很大,可以使用桶排序,时间复杂度O(N)。
); console.log( urlObj ); // url模块中的format()方法可以将url字符串经过转换后的对象还原成一个url字符串 let urlStr = url.format(...url模块中的parse()方法可以将服务器端从客户端获取的url字符串转换成一个对象,这个对象中可能有如下属性: href:被转换的原URL字符串 protocol:客户端发出请求时使用的协议 slashes...,或根据该查询字符串而转换的对象(这里受parse()方法所用的第二个参数决定) hash:URL字符串中散列字符串,包含起始字符"#" parse()方法使用方式:url.parse( urlStr,...在使用url.parse( urlStr )将指定URL字符串转换成对象后,还可以使用url.format( urlObj )将转换后的URL对象还原成URL字符串。...maxKeys 属性来指定转换后的对象中的属性个数,如果将maxKeys属性值设为0,则等于不使用maxKeys属性值。
明白了HTTP请求的头信息后,我们还需要对请求地址有所了解。再者,HTTP GET请求是靠URL实现的,所以了解URL的构造,处理URL的重要性不言而喻。...之后的查询信息 fragment 在散列符号 # 之后 锚点信息 Hash信息 下面是一个典型的URL字符串,我们对其用parse_url()解析,并输出其结果数组。...URL信息后,我们也更需要学会拼合URL信息,拼合URL信息有一个专门的函数http_build_url(),但此函数因其处理繁琐,一般较少使用,我们常用字符串来拼合URL,在处理较多的查询信息(query_string...http_build_query()函数能帮我们将一个关联数组快速拼合成一个查询字符串,它甚至可以将一个对象分析拼合为一个查询字符串,但要注意,它只能保留修饰符为"public"的"属性",其余信息将会被舍弃...pathname 当前URL的路径部分 port 当前URL的端口号 protocol 当前URL的协议 search 查询字符串
如果我们使用MD5算法作为散列函数,它将生成一个128位的散列值。在base64编码之后,我们将得到一个超过21个字符的字符串(因为每个base64字符编码哈希值的6位)。...例如:我们决定将所有以字母“E”开头的URL放在DB分区中,但后来我们意识到,我们有太多以字母“E”开头的URL。 B基于散列的分区:在这个方案中,我们对存储的对象进行散列。...然后根据散列计算要使用的分区。在我们的例子中,我们可以使用“key”或实际URL的散列来确定存储数据对象的分区。...我们的散列函数将把URL随机分配到不同的分区(例如,我们的散列函数总是可以将任何键映射到[1…256]之间的数字),这个数字将代表我们存储对象的分区。...对于我们的系统来说,最近最少使用(LRU)是一个合理的策略。在此策略下,我们首先放弃最近使用最少的URL。我们可以使用链接的散列图或类似的数据结构来存储URL和散列,这也将跟踪最近访问的URL。
1.2 基于url拦截 基于url拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的...1.4 散列算法 散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容。散列算法常用于对密码进行散列,常用的散列算法有MD5、SHA。...”去md5破解网站很容易进行破解,如果要是对111111和salt(盐,一个随机数)进行散列,这样虽然密码都是111111加不同的盐会生成不同的散列值。...1.4.2 在realm中使用 实际应用是将盐和散列后的值存在数据库中,自动realm从数据库取出盐和加密后的值由shiro完成密码校验。 1.4.2.1 自定义realm ?...1.3.2 权限字符串规则 权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
使用散列存储文章数据 与之前使用字符串键存储文章数据的做法相比,使用散列存储文章数据只需要在数据库里面创建一个键,并且因为散列的字段名不需要添加任何前缀,所以它们可以直接反映字段值存储的是什么数据。...Redis 为散列键提供了一系列操作命令,通过使用这些命令,用户可以: 为散列的字段设置值,或者只在字段不存在的情况下为它设置值。 从散列里面获取给定字段的值。...获取散列包含的所有字段、所有值或者所有字段和值。 本章接下来将对以上提到的散列操作进行介绍,说明如何使用这些操作去构建各种有用的应用程序,并在最后详细地说明散列键与字符串键之间的区别。...散列结构 HINCRBY:对字段存储的整数值执行加法或减法操作 与字符串键的 INCRBY 命令一样,如果散列的字段里面存储着能够被 Redis 解释为整数的数字,那么用户就可以使用 HINCRBY 命令为该字段的值加上指定的整数增量...: HINCRBY hash field increment HINCRBY 命令在成功执行加法操作之后将返回字段当前的值作为命令的结果。
cryptography:密码管理,提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。 比如md5散列算法。...盐进行散列。...\ 正常使用时散列方法: 在程序中对原始密码+盐进行散列,将散列值存储到数据库中,并且还要将盐也要存储在数据库中。...//构造方法中: //第一个参数:明文,原始密码 //第二个参数:盐,通过使用随机数 //第三个参数:散列的次数,比如散列两次,相当...当然了,自定义后的reaml也需要在配置文件中写上我们的自定义reaml的位置的。 散列算法就是为了让密码不被别人给破解。我们可对原始的密码加盐再进行散列,这就加大了破解的难度了。
,它的散列值是不变的,而且这个对象需要实现方法。...一般来讲,用户自定义的类型的对象都是可散列的,散列值就是它们的 id() 函数的返回值,所以这些对象在比较的时候都是不相等的。...下面这段代码实现了 StrKeyDict0 类,StrKeyDict0 类在查询的时候把非字符串的键转化为字符串。...如果要把一个对象放入散列表,那么首先要计算这个元素的散列值。Python内置的 hash() 方法可以用于计算所有的内置类型对象。如果两个对象在比较的时候是相等的,那么它们的散列值也必须相等。...如果不匹配(散列冲突),再在散列表中再取几位,然后处理一下,用处理后的结果当做索引再找表元。 然后重复上面的步骤。
# 创建一个数组时,会在内存中开辟一块固定长度的区域用于直接存储元素,扩容要考虑这块区域的后面是否有存储其他对象,所以数组在定义好之后就无法扩容了。...# 字典本质也是一个数组,但其索引是键经过散列函数处理后得到的散列值,散列函数的目的是使键均匀地分布在散列表中, # 并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。...# **散列表中散列函数的设计困难在于将数据均匀分布在散列表中,从而尽量减少散列碰撞和冲突。 # # 字典如何添加和查询?...# **添加:**Python 调用内部的散列函数,将键(Key)作为参数进行转换,得到一个唯一的地址(这也就解释了为什么给相同的键赋值会直接覆盖的原因, # 因为相同的键转换后的地址是一样的),然后将值...**查询:**使用散列函数将key转换为数组的下标,并定位到数组对应位置获取value。 # # 字典为什么是无序的?
} 获取对象的hashcode以后,先进行移位运算,然后再和自己做异或运算,即:hashcode ^ (hashcode >>> 16),这一步甚是巧妙,是将高16位移到低16位,这样计算出来的整型值将...使用方法跟HashSet类似 ArrayMap的key是任意对象,list等等,一般是存一个键值,获取数据简单 map.keyAt(0) map.valueAt(0) ArrayMap的内部实现是两个数组...如果要用对象作为key的话需要重新该对象的equals方法和hashCode方法。 new一个新的对象时,地址变了,不能保证hash值和equals结果还是一样。...调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。 内存中使用LRUCache是最合适的。...当我们按照键值查询元素时,我们用同样的散列函数,将键值转化数组下标,从对应的数组下标的位置取数据。 时间复杂度 插入一个数据,最好情况下,不需要扩容,最好时间复杂度是 O(1)。
基于url拦截 基于url拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的...设置到securityManager securityManager.realms=$customRealm 散列算法 散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容...散列算法常用于对密码进行散列,常用的散列算法有MD5、SHA。...”去md5破解网站很容易进行破解,如果要是对111111和salt(盐,一个随机数)进行散列,这样虽然密码都是111111加不同的盐会生成不同的散列值。...权限字符串规则 权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
6.XSS(跨站脚本攻击,cross-site script) (1)表单 在URL添加JavaScript代码,获取用户表单信息,并且提交到攻击者的服务器。...)%> 使用 HTML 编码一个字符串的含意是什么呢?...使用 HTML 编码字符串时,危险字符如 被替换为 HTML 实体,如 。所以,当使用 HTML 编码字符串 。浏览器在解析编码的字符串时不再执行 JavaScript 脚本。...而是显示无害的页面。 方法二: 除了在视图中显示数据时使用 HTML 编码数据,还可以在将数据提交到数据库之前使用 HTML 编码数据。...密码加密:密码+salt --> md5(散列函数)–> 保存散列值 破解方法: 穷举法、字典 调用相同散列函数处理候选密码得到散列值,与目标散列值比对。
o(1)的代价就可以查询url # 10000000*2byte*50个字符/1024/1024/1024=9G # 3.url经过md5等方法哈希后保存到set中 # 4.用 bitmap...2.将访问过的ur保存到set内存中 将访问过的ur保存到set中,只需要o(1)的代价就可以查询url,取url方便快速,基本不用查询,但是随着存储的url越来越多,占用内存会越来越大。...散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。...该函数将数据打乱混 合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常 用一个短的随机字母和数字组成的字符串来代表。...,通过K个散列函数将这个元素映射成一个位数组中的K个 点,把它们置为1。
网络爬虫的过程: 爬虫通过本地或远程DNS,获取URL对应的IP地址 根据获取的IP地址与访问内容封装HTTP请求 爬虫打出HTTP请求 服务器接收信息,根据HTTP内容寻找web资源 服务器创建...URL 所有的URL去重都是在内存上进行的——>可提速 2、Hash去重 Hash,也称为哈希,散列,是把任意长度的输入,通过给定的函数,转换为长度固定的输出 Hash的实质是一种压缩映射,散列值的空间通常远小于输入的空间...,截取中间X位作为存储位置(适用于不知道关键字的分布) 折叠法:拆分关键字 随机数法:使用随机数作为存储位置 除留余数法:适用余数作为存储位置 2.2、Hash去重所遇到的问题及解决方法 问题: 通常hash...函数映射得到的散列值,并不能保证唯一性 不同的输入可能会得到相同的散列值,这种现象称为Hash碰撞 解决方法: 开放寻址法 拉链法 1、开放寻址法 开放寻址:所有的元素经过Hash映射后都存放在散列表中...,生成散列值,来判断URL的唯一值 MD5是一种基于Hash的加密算法,它可以压缩URL生成: ①一个压缩的128位整数 ②一个Hash物理地址 使用MD5算法进行Hash映射,发生Hash碰撞的几率小
查询 插入数据后,我们可以利用 find_one() 或 find() 方法进行查询,其中 find_one() 查询得到的是单个结果,find() 则返回一个生成器对象。...:首先指定查询条件,然后将数据查询出来,修改年龄后调用 update() 方法将原条件和修改后的数据传入。...首先,声明一个 Redis 连接字符串,然后调用 from_url() 方法创建 ConnectionPool,接着将其传给 StrictRedis 即可完成连接,所以使用 URL 的连接方式还是比较方便的...修改后的字符串长度 mset(mapping) 批量赋值 mapping:字典或关键字参数 redis.mset({'name1': 'Durant', 'name2': 'James'}) 将 name1...散列操作 Redis 还提供了散列表的数据结构,我们可以用 name 指定一个散列表的名称,表内存储了各个键值对,用法总结如表所示。
可散列的数据类型 在Python词汇表中,关于可散列类型的定义有这样一段话: “如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__()方法。...另外可散列对象还要有__eq__()方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的。” 重点是散列值不变!...为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以1100100取余,即得到编号作为该表的下标。...我的理解是,散列值是要被尽量打散的,1.0001和1.0002相差0.0001,这个0.0001被打散后的值导致它们的散列值相差很大。...所有由用户自定义的对象默认都是可散列的,因为它们的散列值由id()来获取(符合第1条),而且它们都是不相等的(符合第2条和第3条)。
散列表的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。...有很多处理散列碰撞冲突的方法,主要分为拉链法和线性探测法。 散列表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。...散列函数和键的类型有关。对于每种类型的键我们都需要一个与之对应的散列函数。 散列函数 1. 正整数 获取正整数散列值最常用的方法是使用除留余数法。...即对于大小为素数M的数组,对于任意正整数k,计算k除以M的余数。M一般取素数。 2. 字符串 将字符串作为键的时候,我们也可以将他作为一个大的整数,采用保留除余法。...α=num/capacity的比值 ,我们将α成为散列表的使用率。
领取专属 10元无门槛券
手把手带您无忧上云