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 ...
随机推荐
- 计算机网络再次整理————tcp例子[五]
前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...
- Lesson2——Pandas库下载和安装
pandas目录 简介 Python 官方标准发行版并没有自带 Pandas 库,因此需要另行安装.除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而 ...
- react 没有嵌套关系的组件通讯
前提准备四个文件,两个子组件:List.List2和一个events.js文件以及一个App.js父组件; 在src目录下创建events.js,里面的内容如下: // events.js(以常用的发 ...
- [论文笔记][半监督语义分割]Universal Semi-Supervised Semantic Segmentation
论文原文原文地址 Motivations 传统的训练方式需要针对不同 domain 的数据分别设计模型,十分繁琐(deploy costs) 语义分割数据集标注十分昂贵,费时费力 Contributi ...
- SP419/422 TRANSP(2) - Transposing is Fun
首先可以发现转置本质上就是一个置换,问题就转化为求一个排列排成有序的最少次数. 这是一个经典问题,答案为点数减循环置换的个数,考虑如何求循环置换. 发现有两个特殊性质:置换为转置,矩阵的边长为 \(2 ...
- Swift中类的使用
主要内容 类的介绍和定义 类的属性 类的构造函数 一. 类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定义类呢? class是Swift中的 ...
- Swift中数据类型
Swift类型的介绍 Swift中的数据类型也有:整型/浮点型/对象类型/结构体类型等等 先了解整型和浮点型 整型 有符号 Int8 : 有符号8位整型 Int16 : 有符号16位整型 Int32 ...
- redis中scan和keys的区别
scan和keys的区别 redis的keys命令,通来在用来删除相关的key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys的时候,会执行的比较慢,更为致命的是,这个命令会阻塞r ...
- PHP中常见的数字掐头去尾操作方法
四舍五入round round( float $val[, int $precision = 0[, int $mode = PHP_ROUND_HALF_UP]] ) : float 对浮点数进行四 ...
- C#后台去除HTML标签
public string NoHTML(string Htmlstring) { //删除脚本 Htmlstring = Regex.Replace(Htmlstring, @"<s ...