哈希

数据加密方法及原理介绍

非 Y 不嫁゛ 提交于 2020-02-04 22:14:17
一、加密术语 1、加密 透过数学公式运算,使文件或数据模糊化,将容易识别的明文变成不可识 别的密文 用于秘密通讯或安全存放文件及数据 2、解密 为加密的反运算 将已模糊化的文件或数据还原,由密文还原出明文 3、密钥 是加密/解密运算过程中的一个参数,实际上就是一组随机的字符串 二、加密方法 1、对称式加密 使用同一把密钥对数据进行加密和解密 ,又称对称密钥 (Symmetric Key) 或(Secret Key) 进行加密通信前需要将密钥先传送给对方 ,或者双方通过某种密钥交换方法得到一个对 称密钥 缺点 :破解相对较容易 优点 :加密 /解密运算相对简单 ,耗用运算较少 ,加密 /解密效率高 常见算法 :40Bits ~128Bits DES,3DES,AES,RC2,RC4 等 2、非对称式加密 (也称为公钥 /私钥加密 ) 公钥加密主要用于身份认证和密钥交换 .公钥加密 ,也被称为 "不对称加密法 ",即加解密过 程需要两把不同的密钥 ,一把用来产生数字签名和加密数据 , 另一把用来验证数字签名和对 数据进行解密 . 使用公钥加密法 ,每个用户拥有一个密钥对 ,其中私钥仅为其个人所知 , 公钥则可分发给 任意需要与之进行加密通信的人 .例如 :A 想要发送加密信息给 B,则 A 需要用 B 的公钥加 密信息 ,之后只有 B 才能用他的私钥对该加密信息 进行解密 .

[go]map源码

混江龙づ霸主 提交于 2020-02-04 11:36:54
map数据结构概述 map 的设计也被称为 “The dictionary problem”, 它的任务是设计一种数据结构用来维护一个集合的数据, 并且可以同时对集合进行增删查改的操作。 map最主要的数据结构有两种: 哈希查找表(Hash table) 查找表用一个哈希函数将 key 分配到不同的桶(bucket,也就是数组的不同 index) 开销主要在哈希函数的计算以及数组的常数访问时间。在很多场景下,哈希查找表的性能很高。 哈希查找表最差是 O(N), 平均查找效率是 O(1) 遍历哈希查找表则是乱序的 解决冲突的办法: 链表法和开放地址法 搜索树(Search tree) 一般采用自平衡搜索树,包括:AVL 树,红黑树(c++)。 自平衡搜索树法的最差搜索效率是 O(logN) 遍历自平衡搜索树,返回的 key 序列,一般会按照从小到大的顺序 注: Go 语言采用的是哈希查找表,并且使用链表解决哈希冲突。 hash函数 hash函数,有加密型和非加密型。 加密型的一般用于加密数据、数字摘要等,典型代表就是md5、sha1、sha256、aes256这种; 非加密型的一般就是查找。在map的应用场景中,用的是查找。选择hash函数主要考察的是两点:性能、碰撞概率。 golang使用的hash算法根据硬件选择,如果cpu支持aes,那么使用aes hash

hashtable和hashmap

旧时模样 提交于 2020-02-04 07:59:00
1.hashtable和hashmap    [1]这两个结构都采用数组+链表实现,称作hashmap是因为它的每一个元素是一个key-value对。   [2]hashtable是线程安全的,它的每个方法中都加入了Synchronize方法,意思是多线程时可以直接调用提供的方法,而不用在外部进行加锁同步。    hashmap不是线程安全的,因此多线程时必须在外部加锁进行同步。   [3]hashtable不支持null key和null value。    hashmap支持null key和null value。null key只能有一个,null value可以作为正常的value。当get()方法返回null时,可能该key对应的value就是null,因此不能用get()来判断是否存在某个key,而应该用containsKey()啦判断。   [4]hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。    hashmap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。   [5]创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。也就是说Hashtable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。之所以会有这样的不同

HashMap与HashTable的区别

a 夏天 提交于 2020-02-04 07:58:44
(仅列出重要的) 1,Hashtable既不支持Null key也不支持Null value;   HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。 2,Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步   HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。   虽然HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。这样设计是合理的。在我们的日常使用当中,大部分时间是单线程操作的。HashMap把这部分操作解放出来了。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。       ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。 3,Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。   创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小

PHP 创建区块链

徘徊边缘 提交于 2020-02-04 06:51:20
前话 提供一个思路帮助你了解区块链基础运作,文本并不是一个完整的区块链,希望你能举一反三 源码: https://github.com/ar414-com/phpblock 记住 区块链是一个 不可变的、有序的 被称为块的记录链。它们可以包含交易、文件或任何您喜欢的数据。但重要的是,他们用哈希 一起被链接在一起 需要准备什么? php5.6+ 1、Block 区块 块是什么样的? 每个块都有一个 索引 ,一个 时间戳(Unix时间戳) ,一个 事务列表 , 一个 校验(工作证明算法生成的证明) 和 前一个块的哈希 。 block = { 'index' : 2 , 'timestamp' : 1506057125 , 'transactions' : [ { 'sender' : "8527147fe1f5426f9dd545de4b27ee00" , 'recipient' : "a77f5cdfa2934df3954a5c7c7da5df1f" , 'amount' : 5 , } ] , 'proof' : 324984774000 , 'previous_hash' : "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" } 在这一点上,一个 区块链 的概念应该是明显的 -

为新员工分配部门

断了今生、忘了曾经 提交于 2020-02-03 21:19:22
import java.util.Scanner; public class Example { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入新员工的姓名:"); String name = scan.nextLine();// 接收员工名称 System.out.println("请输入新员工应聘的编程语言:"); String language = scan.nextLine();// 接收员工应聘的编程语言 // 根据编程语言确定员工分配的部门 System.out.println("编程语言的hashCode:"+language.hashCode()); switch (language.hashCode()) { case 3254818:// java的哈希码 case 2301506:// Java的哈希码 case 2269730:// JAVA的哈希码 System.out.println("员工"+name+"被分配到Java程序开发部门。"); break; case 3104:// c#的哈希码 case 2112:// C#的哈希码 System.out.println("员工"+name+

115网盘怎么找片(➕)

谁说我不能喝 提交于 2020-02-03 20:12:26
一、哈希函数 哈希函数的特性: 1、碰撞阻力(collision resistence) 具有强碰撞阻力的哈希函数H(),很难找到输入x≠y,使得H(x)==H(y)。 碰撞阻力的特性可用于检测数据是否被篡改,只要改变数据的一个字节,就会造成哈希结果的大不相同。比特币中的哈希指针就是用的这个特性,每个区块保存上一个区块的哈希,因此用户只要记住最新区块的哈希,就可以保证整个区块链未被篡改。 注意: 没有哪一个哈希函数能够从数学上证明具有碰撞阻力特性,SHA-256、SHA3只是经过实践目前仍没有有效方法进行碰撞,因此是可靠的,MD5、SHA1这些曾经具有碰撞阻力特性的哈希函数已经被破解,不再具有碰撞阻力特性。 2、单向不可逆(hiding) 由x可以很容易的计算出H(x),但是由H(x)不可能推算出x。 单向不可逆特性可用于digital commitment数字承诺,用户可以将信息和一些随机数据组合计算出哈希,然后公布哈希给别人,这样可以藏匿信息内容,别人无法猜测承诺的信息;等到需要验证的时候,才将承诺内容公开用于计算哈希,如与事先公布的哈希一致,则可以证明自己预先承诺过的信息。本人也无法更改承诺内容,因为这样会造成计算的哈希与一开始公布的哈希不一致。 注意: 输入取值必须来自广泛集合,且均匀分布,这样单向不可逆特性才会有效。 本人在做银联人脸识别支付项目的时候

数据结构之HashMap详解(一)

醉酒当歌 提交于 2020-02-03 07:30:03
在之前有一篇博客介绍了HashMap, 数据结构之Hash表(哈希表) 现在对之前的内容做一个补充。 说HashMap之前,看下数组: 数组的优点在于查找速度快,每个区域都是紧挨着的,并且有下标,可以根据下标快速找到要查找的元素。 缺点:增删麻烦,如果在第二个元素后面再添加个元素的话,那么就需要重新建一个数组,填入对应的信息。 链表:每个内存除了存放自身的元素外,还保留下个内存区域的地址, 优点:插入新元素方便,只需要将指针指向新元素,新元素指向原来的下一个指针即可。 缺点:查找速度慢。链表不像数组那样有下标,链表查找元素只能从head结点开始,一个一个向下找。 而散列表则是综合了两者优点于一身的结构: 上面是数组,数组每个区域内是链表。 说到散列表,就应当说哈希,没有哈希,散列表就无法寻址找数据, 哈希 哈希:Hash也称散列、哈希,对应的英文都是Hash,基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出,这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。 Hash特点: 1、hash值不可以反向推导出原始的数据 2、输入的数据的微小变化会得到完全不同的hash值,相同的数据可以得到相同的值。 3、哈希算法的执行效率要高效 4、hash算法的冲突概率要小 hash原理是将输入空间的值映射成hash空间内

散列 - Java 实现

泪湿孤枕 提交于 2020-02-03 06:35:24
此处使用分离链接法来解决冲突,即将散列到同一个桶的所有元素都保存到一个链表中。 对象必须实现 hashCode() 方法(计算哈希值)和 equals() 方法(判断是否已经存在该元素)。 除了链表,也可以使用其他的数据结构来解决冲突,如,二叉搜索树、另一个散列表 … 但是,我们期望如果散列表足够大且散列函数可以将元素分布均匀,那么所有的链表都应该是短的,此时使用简单的链表就足以。 装填因子 定义装填因子 λ = 元 素 总 数 / 哈 希 表 桶 数 \lambda = 元素总数 / 哈希表桶数 λ = 元 素 总 数 / 哈 希 表 桶 数 ,即每个冲突链表的平均长度为 λ \lambda λ 。 在一次失败的查找中,要探查的节点数平均为 λ \lambda λ :先根据哈希值定位到一个哈希桶,然后再遍历对应的冲突链表(平均含 λ \lambda λ 个节点)。 在一次成功的查找中,要探查的节点数平均为 λ / 2 + 1 \lambda / 2 + 1 λ / 2 + 1 :先根据哈希值定位到一个哈希桶,然后再遍历对应的冲突链表,平均来看,有一半的“其他”节点被检查到,接着就是目标节点。 由此来看,散列表的大小并不重要,装填因子才是重要的! 再散列 就是重新构建一个散列表,然后再重新插入每一个元素至新的散列表中。 其运行时间为 O(N) 。 在 rehash 之前,必然已存在

字符串哈希算法

女生的网名这么多〃 提交于 2020-02-03 04:50:49
哈希算法 字符串的哈希算法,通俗的理解,就是将一个字符串,转化成整数 原来我们进行字符串匹配的时候,就是一个个去匹配,那么时间复杂度是o(n),如果转化成数字,去匹配那么时间复杂度会变成o(1)。 哈希算法的引入 首先联想一下二进制数,对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): 1101101=1 * 2 ^ 6+1 * 2 ^ 5+0 * 2 ^ 4+1 * 2 ^ 3+1 * 2 ^ 2+1*2 ^1+1 这是二进制转化为十进制 那么如果我们想把字符串转化成十进制的整数,那么我们是不是就可以把这个字符串设为p进制的数,然后将a~z的字母设为1 ~26,那么我们在进行转化的时候是不是就可以按照二进制转换成十进制那样那么哈希就是经过一个转换,再模上一个q,就是哈希的解法了。 上图是我们以字符串abc为示范 得到的结果就是我们想要的整数,但是在有时候,难免会出现,两个字符串不相同但是整数相同的情况,为了尽量减少这种情况,我们把p往往取为131或者13331,然后q我们一般取2的64次方,因为我们把哈希算出来的整数存放在unsigned long long 中,而这个类型的数据溢出就相当于系统自动帮你进行2的64次方取模运算,所以我们在算哈希值的时候,就可以不用取模了。 哈希值 我们在算一个字符串的哈希值的时候,会把前缀的哈希值都算出来