SHA算法(及示例)演变历史
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
家族成员
SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。 [1]
SHA-0和1
SHA-0破解
SHA-1破解
SHA-1算法
Initialize variables:
h0 := 0x67452301
h1 := 0xEFCDAB89
h2 := 0x98BADCFE
h3 := 0x10325476
h4 := 0xC3D2E1F0
Pre-processing:
append the bit '1' to the message
append k bits '0', where k is the minimum number >= 0 such that the resulting message
length (in bits) is congruent to 448 (mod 512)
append length of message (before pre-processing), in bits, as 64-bit big-endian integer
Process the message in successive 512-bit chunks:
break message into 512-bit chunks
for each chunk
break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15
Extend the sixteen 32-bit words into eighty 32-bit words:
for i from 16 to 79
w[i] := (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1
Initialize hash value for this chunk:
a := h0
b := h1
c := h2
d := h3
e := h4
Main loop:
for i from 0 to 79
if 0 ≤ i ≤ 19 then
f := (b and c) or ((not b) and d)
k := 0x5A827999
else if 20 ≤ i ≤ 39
f := b xor c xor d
k := 0x6ED9EBA1
else if 40 ≤ i ≤ 59
f := (b and c) or (b and d) or (c and d)
k := 0x8F1BBCDC
else if 60 ≤ i ≤ 79
f := b xor c xor d
k := 0xCA62C1D6
temp := (a leftrotate 5) + f + e + k + w[i]
e := d
d := c
c := b leftrotate 30
b := a
a := temp
Add this chunk's hash to result so far:
h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d
h4 := h4 + e
Produce the final hash value (big-endian):
digest = hash = h0 append h1 append h2 append h3 append h4
SHA-2
应用
哈希表介绍
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
15 111 % 15

问题
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址..),当输入该员工的id时,要求查找到该员工的 所有信息.
要求:
不使用数据库,,速度越快越好=>哈希表(散列)
添加时,保证按照id从低到高插入 [课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?]
使用链表来实现哈希表, 该链表不带表头[即: 链表的第一个结点就存放雇员信息]
思路分析并画出示意图
代码实现[增删改查(显示所有员工,按id查询)]

代码实现
1 package cn.smallmartial.hashTable;
2
3 import java.util.HashMap;
4 import java.util.Scanner;
5
6 /**
7 * @Author smallmartial
8 * @Date 2019/6/13
9 * @Email smallmarital@qq.com
10 */
11 public class HashTableDemo {
12
13 public static void main(String[] args) {
14 //创建hash表
15 HashTab hashTab = new HashTab(7);
16
17 //写一个简单的菜单
18 String key = "";
19 Scanner scanner = new Scanner(System.in);
20 while(true) {
21 System.out.println("add: 添加雇员");
22 System.out.println("list: 显示雇员");
23 System.out.println("find: 查找雇员");
24 System.out.println("exit: 退出系统");
25
26 key = scanner.next();
27 switch (key) {
28 case "add":
29 System.out.println("输入id");
30 int id = scanner.nextInt();
31 System.out.println("输入名字");
32 String name = scanner.next();
33 //创建 雇员
34 Emp emp = new Emp(id, name);
35 hashTab.add(emp);
36 break;
37 case "list":
38 hashTab.list();
39 break;
40 case "find":
41 System.out.println("请输入要查找的id");
42 id = scanner.nextInt();
43 hashTab.findEmpById(id);
44 break;
45 case "exit":
46 scanner.close();
47 System.exit(0);
48 default:
49 break;
50 }
51 }
52 }
53 }
54 //创建hashTab
55 class HashTab{
56 private int size;
57 private EmpLinkedList[] empLinkedListArray;
58
59 public HashTab(int size) {
60 this.size = size;
61 empLinkedListArray = new EmpLinkedList[size];
62
63 for (int i = 0; i < size; i++) {
64 empLinkedListArray[i] = new EmpLinkedList();
65 }
66
67 }
68
69 //添加雇员
70 public void add(Emp emp){
71 //根据员工ID 添加到哪条联
72 int hashFun = hashFun(emp.id);
73 empLinkedListArray[hashFun].add(emp);
74
75 }
76
77 //遍历链表
78 public void list(){
79 for (int i = 0; i < size; i++) {
80 empLinkedListArray[i].list(i);
81 }
82 }
83
84 //根据输入的id,查找雇员
85 public void findEmpById(int id) {
86 //使用散列函数确定到哪条链表查找
87 int empLinkedListNO = hashFun(id);
88 Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);
89 if(emp != null) {//找到
90 System.out.printf("在第%d条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id);
91 }else{
92 System.out.println("在哈希表中,没有找到该雇员~");
93 }
94 }
95 public int hashFun(int id){
96 return id % size;
97 }
98 }
99 //表示雇员
100 class Emp {
101 public int id;
102 public String name;
103 public Emp next;
104
105 public Emp(int id, String name) {
106 this.id = id;
107 this.name = name;
108 }
109 }
110 //表示链表
111 class EmpLinkedList{
112 private Emp head;
113
114 public void add(Emp emp){
115 if (head == null){
116 head = emp;
117 return;
118 }
119
120 Emp curEmp = head;
121 while (true){
122 if (curEmp.next == null){
123 break;
124 }
125 curEmp = curEmp.next;
126 }
127 curEmp.next = emp;
128 }
129
130 //遍历
131 public void list(int no){
132 if (head == null){
133 System.out.println("第"+no+"前链表为空");
134 return;
135 }
136 System.out.print("第"+no+"链表信息为:");
137 Emp curEmp = head;
138 while (true){
139 System.out.print(curEmp.id+"=>"+curEmp.name);
140 if (curEmp.next == null){
141 break;
142 }
143 curEmp = curEmp.next;
144 }
145 System.out.println();
146 }
147
148 //根据id查找雇员
149 //如果查找到,就返回Emp, 如果没有找到,就返回null
150 public Emp findEmpById(int id) {
151 //判断链表是否为空
152 if(head == null) {
153 System.out.println("链表为空");
154 return null;
155 }
156 //辅助指针
157 Emp curEmp = head;
158 while(true) {
159 if(curEmp.id == id) {//找到
160 break;//这时curEmp就指向要查找的雇员
161 }
162 //退出
163 if(curEmp.next == null) {//说明遍历当前链表没有找到该雇员
164 curEmp = null;
165 break;
166 }
167 curEmp = curEmp.next;//以后
168 }
169
170 return curEmp;
171 }
172 }
SHA算法(及示例)演变历史的更多相关文章
- 如何生成安全的密码 Hash:MD5, SHA, PBKDF2, BCrypt 示例
密码 Hash 值的产生是将用户所提供的密码通过使用一定的算法计算后得到的加密字符序列.在 Java 中提供很多被证明能有效保证密码安全的 Hash 算法实现,我将在这篇文章中讨论其中的部分算法. 需 ...
- 前端文摘:Web 开发模式演变历史和趋势
今天的<前端文摘>给大家分享一篇玉伯的文章.文章详细介绍了 Web 开发的四种常用模式以及未来可能成为流行趋势的 Node 全栈开发模式,相信你看了以后一定会有收获. 您可能感兴趣的相关文 ...
- Web 开发模式演变历史和趋势
前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的优劣. 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 ...
- [转] Web 开发模式演变历史和趋势
文章转自梦想天空--前端文摘:Web 开发模式演变历史和趋势 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 3-5 人搞定所有开发.页面由 JSP.P ...
- SHA算法摘要处理
byte[] input="sha".getBytes();//待做消息摘要算法的原始信息,可以是任意字符串 MessageDigest sha=MessageDigest.get ...
- 密码学系列之:NIST和SHA算法
目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...
- SHA算法
安全Hash函数(SHA)是使用最广泛的Hash函数.由于其他曾被广泛使用的Hash函数都被发现存在安全隐患,从2005年至今,SHA或许是仅存的Hash算法标准. SHA发展史 SHA由美国标准与技 ...
- C#与JAVA平台RSA算法交互示例
很久以前的文章中,演示了如何对于.net和win32下面的delphi的RSA互操作性的实现,对于C#和JAVA之前的RSA加密解密也是很简单的,一般都采用了标准的规范,所以在互操作性方面是很方便的. ...
- floodfill算法解题示例
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法.因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名.在GNU Go和扫雷中,Floo ...
随机推荐
- MySQL读写问题(锁)
一.概述 读-读:并发不存在问题,不需要加锁 写-写:并发存在问题,可能会造成脏写(一个事务没有写完,另一个事务也对相同的数据进行写),但是这种情况,任何一种隔离级别都不允许发生,在隔离级别的时候就解 ...
- WebAssembly环境搭建
Environment:Ubuntu 16.06 + emscripten URL: https://emscripten.org/docs/getting_started/downloads.htm ...
- having筛选结果集
题目要求:让你输出有两科及其以上挂科(60分及格)的学生的名单? name subject score 错误的做法: mysql> select name, count(scoure<60 ...
- OC和C对比
1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...
- FileInputStream 类与 FileReader 类的区别
FileInputStream 类与 FileReader 类的区别: 两个类的构造函数的形式和参数都是相同的,参数为 File 对象或者表示路径的 String ,它们到底有何区别呢? FileIn ...
- git忽略项目中的指定文件
git仓库提交原则:提交给远程仓库的只有源代码和相关的配置文件 如果是使用模板建立的仓库,会自带有.gitignore文件,无需再建立.当然如果需要在指定文件忽略,只需要在这个文件中添加指定的文件即可 ...
- Node.js躬行记(15)——活动规则引擎
在日常的业务开发中,会包含许多的业务规则,一般就是用if-else硬编码的方式实现,这样就会增加逻辑的维护成本,若无注释,可能都无法理解规则意图. 因为一旦规则有所改变,那么就需要修改代码再发布代码, ...
- HTTP状态码100、200、300、400、500、600的含义
1xx (临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 100 (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101 (切换协议) 请 ...
- 流量录制与回放在vivo的落地实践
一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...
- SQLServer误删ReportServerTempDB导致打不开其他库——解决方案
无意间删除了ReportServerTempDB库和ReportServer 导致其他库连接不上 错误:报表服务器无法打开与报表服务器数据库的连接.所有请求和处理都要求与数据库建立连接. 解决方案: ...