• java - 散列算法 SHA-256 hash值计算


    前言

      如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
      而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


    java - 散列算法 SHA-256 hash值计算

    1. 散列算法是什么?

    散列算法(Hashing Algorithm)是一种将任意长度的输入数据转换为固定长度的输出数据(通常是固定大小的哈希值)的数学函数。

    2. 散列算法的主要特征是什么?

    1. 固定长度输出:无论输入数据的大小如何,散列算法生成的哈希值都具有相同的固定长度。

    2. 高效性:散列算法通常具有高度的计算效率,能够快速生成哈希值。

    3. 不可逆性:散列算法是单向的,即从哈希值无法还原出原始数据。这意味着无法通过哈希值来获取原始数据的内容。

    4. 唯一性:不同的输入数据经过散列算法处理后应该生成不同的哈希值,但由于输出长度是固定的,可能会发生哈希冲突,即不同的输入生成相同的哈希值。

    5. 相似输入产生不同输出:即使输入数据只有微小的变化,也会导致生成完全不同的哈希值。这被称为“雪崩效应”。

    注意的是散列算法生成固定长度的哈希值,但是哈希值是不可逆的,无法还原回原始数据。

    3. 计算SHA-256值有没有可能重复

    SHA-256(Secure Hash Algorithm 256-bit)是一个加密哈希函数,它的设计目标是尽可能地降低哈希冲突的概率,即不同的输入数据尽量生成不同的哈希值。SHA-256 算法的输出长度是256位(32字节),这意味着它可以表示的不同哈希值数量非常庞大,大约为 2^256(约等于 1.1579209e+77)个。

    由于SHA-256 算法的输出空间如此巨大,理论上来说,对于不同的输入数据,生成相同的SHA-256哈希值的可能性是极其微小的,几乎可以忽略不计。这种微小的可能性通常只有在恶意的攻击(如碰撞攻击)或者算法本身存在漏洞的情况下才会出现。

    4. SHA-256算法实现示例

    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class SHA {
    
        public static String encrypt(String msg){
            MessageDigest digest = null;
            try {
                digest = MessageDigest.getInstance("SHA-256");
                byte[] hash = digest.digest(msg.getBytes());
                StringBuilder hexString = new StringBuilder();
                for (byte b : hash) {
                    hexString.append(String.format("%02x", b));
                }
                return hexString.toString();
            } catch (NoSuchAlgorithmException e) {
                // 处理算法不可用的情况
                e.printStackTrace();
            }
            return null;
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    测试类:

    import lombok.extern.slf4j.Slf4j;
    import org.example.DemoCommonTool;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = DemoCommonTool.class)
    @Slf4j
    public class SHATest  {
    
        @Test
        public void test(){
            for (int i = 0;i<20;i++) {
                log.info("========================start==================================");
                log.info(SHA.encrypt("sahihalfh那可是当年卢卡斯电话撒豆i阿娇哦i骄傲啊搜饿哦i回复还是分开爱上了凯迪拉克三分而我和日和坊双方的哈利好的啊合法身份安徽疯狂撒法鲁克安家费 "));
                log.info(SHA.encrypt("还是分开23432 和开发建设234 大佬"));
                log.info(SHA.encrypt("DSHFKJ32"));
                log.info("========================end==================================");
            }
        }
    
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    测试结果:

    在这里插入图片描述

    测试成功!!!

  • 相关阅读:
    git 个人常见错误备注
    基于深度学习的三维重建从入门实战教程 原理讲解 源码解析 实操教程课件下载
    数字电路与逻辑设计 之 卡诺图
    【MyBatis】初识这一优秀的持久层框架
    Libco Hook 机制浅析
    嵌入式分享合集116
    VR全景如何助力乡村振兴,VR全景推动农业发展
    MySQL数据库之多表查询
    SpringBoot美食网站系统
    基于LSTM encoder-decoder模型实现英文转中文的翻译机器
  • 原文地址:https://blog.csdn.net/weixin_38316697/article/details/133162826