散列算法

PHP加密函数

旧城冷巷雨未停 提交于 2020-03-03 00:46:45
单向散列加密 单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出.这个散列计算是单向的,即不能对固定长度的输出进行计算从而获取输入信息. 特征:雪崩效应、定长输出和不可逆 作用:确保数据的完整性 MD5 :以 32 字符十六进制数字形式返回散列值。( 如果第二个参数为true,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 ***由于此函数依赖的算法已不足够复杂,不推荐使用此函数对明文密码加密。详细内容参见 附录2 。 ) crypt :单向字符串散列。( 如果第二个参数没有,创建出的会是弱密 码,php5.6之后没有会抛出E_NOTICE 级别的错误。为了更 好的安全性,请确保指定一个足够强度的盐值。 ) 附录1 sha1 :以 32 字符十六进制数字形式返回散列值。( 如果第二个参数为true,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 ***由于此函数依赖的算法已不足够复杂,不推荐使用此函数对明文密码加密。详细内容参见 附录2 。 ) 对称加密 对称加密是指加密和解密使用的密钥是同一个或者可以互相推算. urlencode :编码 URL 字符串(除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)) urldecode :解码已编码的 URL 字符串 base64

shiro学习

删除回忆录丶 提交于 2020-03-02 17:14:23
1. shiro 介绍 1.1 什么是 shiro Apache Shiro 是 Java 的一个安全框架。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。 1.2 为什么要学 shiro 既然 shiro 将安全认证相关的功能抽取出来组成一个框架,使用 shiro 就可以非常快速的完成认证、授权等功能的开发,降低系统成本。 shiro 使用广泛,shiro 可以运行在 web 应用,非 web 应用,集群分布式应用中越来越多的用户开始使用 shiro。 java 领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是 spring security 依赖 spring 运行,而 shiro 就相对独立,最主要是因为 shiro 使用简单、灵活,所以现在越来越多的用户选择 shiro。 1.3 基本功能 1.3.1 Authentication 身份认证/登录,验证用户是不是拥有相应的身份; 1.3.2 Authorization 授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用 户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用 户对某个资源是否具有某个权限

(数据结构)散列表

℡╲_俬逩灬. 提交于 2020-02-27 08:39:32
1.概念 3.散列表函数的要求与特点 4、散列表-散列函数的常用设计方法(了解) 5、散列表-散列冲突 6、散列表-散列冲突解决方案(线性探测法) 8、散列表-散列冲突解方案(二次散列) 9、散列表-散列冲突的解决方案(链表法) 10、散列表-应用介绍 jdk1.7的 11、散列表-hash算法-介绍 来源: https://www.cnblogs.com/curedfisher/p/12370324.html

《算法》笔记 15

拜拜、爱过 提交于 2020-02-27 08:10:22
暴力子字符串查找算法 隐式回退 性能 显式回退 Knuth-Morris-Pratt算法 确定有限状态自动机 DFA的构造 性能 Boyer-Moore算法 跳跃表的构建 性能 Rabin-Karp指纹字符串算法 关键思想 Horner方法 性能 字符串的一种基本操作就是子字符串查找。比如在文本编辑器或是浏览器中查找某个单词时,就是在查找子字符串。子字符串的长度(可能为100或1000)相对于整个文本的长度(可能为100万甚至是10亿)来说一般是很短的,在如此多的字符中找到匹配的模式是一个很大的挑战,为此计算机科学家们发明了多种有趣、经典且高效的算法。 ### 暴力子字符串查找算法 要解决这个问题,首先想到的是暴力查找的方法,在文本中模式可能出现匹配的任何地方检查是否匹配。 #### 隐式回退 首先是隐式回退的实现方式,之所以叫隐式回退,在与显式回退的实现对比后就明白原因了。 public static int search(String pat, String txt) { int patL = pat.length(); int txtL = txt.length(); for (int i = 0; i <= txtL - patL; i++) { int j; for (j = 0; j < patL; j++) if (txt.charAt(i + j) != pat

Map

懵懂的女人 提交于 2020-02-26 23:19:34
对于MAP的理解 映射表的基本思想是:他维护的是键值对的关联,因此可以使用键查找值。标准java类库中的map的几种基本实现包括:HashMap、TreeMap、LinkedHashMap、WeakHashMap、ConcurrentHash、IdentityHashMap。这些都有相同的基本接口Map,但是行为特性不同,表现在效率、键值对的保存及呈现次序、对象的保存周期、映射表如何在多线程程序中工作和判断键等价的策略方面。 关联数组中的基本方法是put()和get(),toString()方法被覆盖为可以打印键值对。使用get()方法,需要传递想要查询的key,后将其关联的值作为结果返回,或返回null。 性能 HashMap使用特殊的值(散列码),取代对键的缓慢搜索,散列码是相对唯一的,用以代表对象的int值,他是通过将该对象的某些信息进行转换生成的。hashCode()是根类Object中的方法,因此所有java对象都能产生散列码。HashMap使用对象的hashCode()进行快速查询。 HashMap:map基于散列表的实现 ,插入和查询“键值对”的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能。 LinkedHashMap:类似于HashMap,在迭代遍历它时,取得键值对的顺序是其插入次序,或者是最近最少使用次序,比HashMap慢,在迭代访问时更快

Map and HashMap

浪尽此生 提交于 2020-02-25 23:44:12
1.1.1. Map 接口 java提供了一组可以以键值对(key-value)的形式存储数据的数据结构,这种数据结构称为Map。我们可以把Map看成一个多行两列的表格,其中第一列存放key,第二列存放value。 而每一行就相当于一组key-value对,表示一组数据。 Map对存入的元素有一个要求,就是key不能重复,所谓不能重复指的是在Map中不能包含两个equals为true的key。 Map对于key,value的类型没有严格要求,只要是引用类型均可。但是为了保证在使用时不会造成数据混乱,通常我们会使用泛型去约束key与value的类型。 1.1.2. put方法 既然我们知道了Map在保存数据时实际上是存入了两部分信息的 ,key与value。那么我们来看看如何向Map中存入数据。 Map提供了一个方法: V put ( K k , V v ) 该方法的作用是将key-value对存入Map中,因为Map中不允许出现重复的key,所以若当次存入的key已经在Map中存在,则是替换value操作,而返回值则为被替换的元素。若此key不存在,那么返回值为null。 1.1.3. get方法 我们学会了如何向Map中存入数据,那么我们再来看看如何获取数据。Map中获取数据的方式是给定Key获取对应的Value。 Map提供了一个方法: V get ( Object key )

哈希表

ⅰ亾dé卋堺 提交于 2020-02-24 12:09:55
前言 # 哈希表,又名散列表。是非常常用的一种数据结构,C#的Hashtable、字典,Java的HashMap,Redis的Hash,其底层实现都是散列表。而在一些互联网公司的面试中,更是技术面试官们必问的一道题目。本文将简单了解哈希表(散列表)这种数据结构。 一、散列表 # 1.1 散列表 # 散列表(哈希表),其思想主要是基于数组支持按照下标随机访问数据时间复杂度为O(1)的特性。可是说是数组的一种扩展。假设,我们为了方便记录某高校数学专业的所有学生的信息。要求可以按照学号(学号格式为:入学时间+年级+专业+专业内自增序号,如2011 1101 0001)能够快速找到某个学生的信息。这个时候我们可以取学号的自增序号部分,即后四位作为数组的索引下标,把学生相应的信息存储到对应的空间内即可。 如上图所示,我们把学号作为key,通过截取学号后四位的函数后计算后得到索引下标,将数据存储到数组中。当我们按照键值(学号)查找时,只需要再次计算出索引下标,然后取出相应数据即可。以上便是散列思想。 1.2 散列函数 # 上面的例子中,截取学号后四位的函数即是一个简单的散列函数。 Copy //散列函数 伪代码 int Hash(string key) { // 获取后四位字符 string hashValue =int.parse(key.Substring(key.Length-4, 4)

PHP的学习--PHP加密

和自甴很熟 提交于 2020-02-24 04:15:32
PHP中的加密方式有如下几种 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串。 raw_output -- 如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 这是一种不可逆加密,执行如下的代码 $password = '123456'; echo md5($password); 得到结果是e10adc3949ba59abbe56e057f20f883e 2. Crype加密 string crypt ( string $str [, string $salt ] ) crypt() 返回一个基于标准 UNIX DES 算法或系统上其他可用的替代算法的散列字符串。 参数 str -- 待散列的字符串。 salt -- 可选的盐值字符串。如果没有提供,算法行为将由不同的算法实现决定,并可能导致不可预料的结束。 这是也一种不可逆加密,执行如下的代码 $password = '123456'; $salt = "test";// 只取前两个 echo crypt($password, $salt); 得到的结果是teMGKvBPcptKo 使用自动盐值的例子如下: $password = crypt(

redis实践:用户注册登录功能

非 Y 不嫁゛ 提交于 2020-02-17 02:46:20
本节将使用PHP和Redis实现用户注册登录功能,下面分模块来介绍具体实现方法。 1.注册 需求描述:用户注册时需要提交邮箱、登录密码和昵称。其中邮箱是用户的唯一标识,每个用户的邮箱不能重复,但允许用户修改自己的邮箱。 我们使用散列类型来存储用户的资料,键名为user:用户ID。其中用户ID是一个自增的数字,之所以使用 ID 而不是邮箱作为用户的标识是因为考虑到在其他键中可能会通过用户的标识与用户对象相关联,如果使用邮箱作为用户的标识的话在用户修改邮箱时就不得不同时需要修改大量的键名或键值。为了尽可能地减少要修改的地方,我们只把邮箱作为该散列键的一个字段。为此还需要使用一个散列类型的键email.to.id来记录邮箱和用户ID间的对应关系以便在登录时能够通过邮箱获得用户的ID。 用户填写并提交注册表单后首先需要验证用户输入,我们在项目目录中建立一个register.php文件来实现用户注册的逻辑。验证部分的代码如下: // 设置Content-type以使 浏览器 可以使用正确的编码显示提示信息, // 具体的编码需要根据文件实际编码选择,此处是utf-8。 header("Content-type: text/html; charset=utf-8"); if(!isset($_POST['email']) || !isset($_POST['password']) ||

哈希是什么?为什么哈希存取比较快?

随声附和 提交于 2020-02-16 07:56:35
  不太恰当的比喻:     XM 指的是“小明”,也指的是“小萌”     XM就是哈希值,小明和小萌就是拥有同一个哈希值的,存在同一个链表的元素。     想要获取小萌,首先使用hashcode获取到这两个人,然后再通过equals获取到小萌。   个人理解      哈希表其实就是一个一维数组,而数组中的每一个元素都是一个单向链表而已。这样的数据结构 解决了数组的增删元素的不足和链表的查询效率的不足 。    数组是存在连续的存储空间,而链表的存储空间不连续 --------------------------------   哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。   哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。   哈希通过将单向数学函数(有时称为“哈希算法”