别找了,Java生成MD5值直接用轮子就好了

先说说 Java 生成 MD5 的原理

Java 生成 MD5 值,本质上都是通过MessageDigest类来实现的。

一共分为四步:

  1. 通过MessageDigest.getInstance("MD5")方法来获取一个MessageDigest实例。这是一个工厂方法,你也可以创建其他算法的实例。

  2. 通过update方法来传入字节数组,并根据该数组更新摘要。

  3. 使用digest()计算并返回byte[]格式的哈希值,并重置摘要。

  4. 用各种办法将byte[]格式的哈希值转为16进制字符串。

翻译成代码如下:

public String getMD5String(String s) throws NoSuchAlgorithmException {
    // 创建md5实例
    MessageDigest messagedigest = MessageDigest.getInstance("MD5");
    // 更新摘要
    messagedigest.update(s.getBytes());
    // 计算哈希并返回
    byte[] digest = messagedigest.digest();
    // 将摘要转换成16进制字符串
    return bufferToHex(digest);
}

愣着干嘛,用轮子呀

话说我又要算字符串的 MD5 值,也要算文件的 MD5 值,而且转 16 进制字符串,这些我都要自己写?

直接用轮子吧。

常用的是这两个工具类:

public void getMD5(String str) {
    // Spring的工具类
    org.springframework.util.DigestUtils.md5DigestAsHex(str.getBytes());
    // commons-codec包的工具类
    org.apache.commons.codec.digest.DigestUtils.md5Hex(str);
}

如果你不是 Spring 工程,且因为莫名其妙不能随便引用新的jar包,那么我建议直接把org.springframework.util.DigestUtils拷贝出来自己用就好了。不建议拷贝commons-codec包的工具类,因为额外引用的类太多。

生成文件夹的 MD5 值

现有的工具类没有直接计算文件夹 MD5 值的方法,而且本身文件夹也没法计算 MD5 值吧。

但是一定要计算,那我们可以自己定义一个算法。很简单,如果是文件夹,则遍历文件夹下的全部文件,对每个文件都计算一次 MD5 值,放到一个列表里。最后把列表中的 MD5 值拼在一起生成一个新的 MD5 值作为文件夹的 MD5 值来使用就好了。

代码如下(直接用了 Spring 的DigestUtils工具类):

/**
 * 获取文件/文件夹md5信息
 * 文件夹md5生成逻辑:遍历文件夹下的全部文件,并计算文件的md5值。
 * 之后将所有文件的md5值拼接在一起去生成一个新的md5值作为文件夹的md5值。
 *
 * @param file
 * @return
 * @throws IOException
 * @throws NoSuchAlgorithmException
 */
public String getFileMD5(File file) throws IOException {
    // 计算文件夹的md5值时,用于存放文件夹下每个文件的md5值
    Set<String> md5List = new HashSet<>();
    fillMD5List(file, md5List);
    if (md5List.isEmpty()) {
        logger.info("路径不存在,不计算md5值,路径:" + file.getPath());
        return "";
    }

    if (md5List.size() == 1) {
        return new ArrayList<>(md5List).get(0);
    }

    StringBuilder sb = new StringBuilder();
    for (String s : md5List) {
        sb.append(s);
    }
    return DigestUtils.md5DigestAsHex(sb.toString().getBytes());
}


public void fillMD5List(File file, Set<String> md5List) throws IOException {
    if (file == null || !file.exists()) {
        return;
    }

    if (file.isDirectory()) {
        File[] f = file.listFiles();
        if (f != null) {
            for (File value : f) {
                fillMD5List(value, md5List);
            }
        }
    } else {
        String md5 = DigestUtils.md5DigestAsHex(new FileInputStream(file));
        md5List.add(md5);
    }
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是使用SharpGL绘制一个轮子的示例代码。此代码假定您已经在Visual Studio中创建了一个SharpGL项目并配置了必要的引用。 ```csharp using SharpGL; public partial class Form1 : Form { private OpenGL gl; public Form1() { InitializeComponent(); gl = openGLControl.OpenGL; } private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e) { gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); gl.LoadIdentity(); gl.Begin(OpenGL.GL_TRIANGLE_FAN); gl.Color(0.7f, 0.7f, 0.7f); gl.Vertex(0.0, 0.0); for (double angle = 0.0; angle <= 2.0 * Math.PI; angle += Math.PI / 6.0) { double x = 0.5 * Math.Sin(angle); double y = 0.5 * Math.Cos(angle); gl.Vertex(x, y); } gl.End(); gl.Begin(OpenGL.GL_TRIANGLE_STRIP); gl.Color(0.5f, 0.5f, 0.5f); for (double angle = 0.0; angle <= 2.0 * Math.PI; angle += Math.PI / 6.0) { double x = 0.5 * Math.Sin(angle); double y = 0.5 * Math.Cos(angle); gl.Vertex(x, y, -0.25); gl.Vertex(x, y, 0.25); } gl.Vertex(0.0, 0.5, -0.25); gl.Vertex(0.0, 0.5, 0.25); gl.End(); } } ``` 这个示例使用了OpenGL的基本图元`GL_TRIANGLE_FAN`和`GL_TRIANGLE_STRIP`。它将一个圆形绘制在xy平面上,并将另一个圆柱体连接到圆形上,形成一个轮子。圆柱体由多个三角形带组成,其中每个三角形带都是一个矩形,包含相邻两个垂直圆柱体表面的四个顶点。`GL_TRIANGLE_FAN`用于绘制圆形,`GL_TRIANGLE_STRIP`用于绘制圆柱体。 ### 回答2: 使用SharpGL绘制一个轮子可以分为以下几个步骤: 1. 初始化OpenGL环境:创建OpenGL控件,并设置视口(Viewport),投影透视矩阵和模型视图矩阵。 2. 绘制外圆环:使用OpenGL的画线函数(glBegin()和glEnd())绘制一个圆环,可以通过设置画线宽度和颜色来调整外圆环的样式。 3. 绘制内圆环:在外圆环的基础上,通过重新设置画线宽度和颜色,绘制一个半径较小的内圆环,形成轮子的中空效果。 4. 绘制轮辐:使用OpenGL的画线函数和旋转变换(glRotatef())来绘制轮子的辐条。可以根据需要确定辐条的数量和角度,保证轮辐均匀分布在轮子的内外圆环之间。 5. 绘制轴承:为了增加轮子的真实感,可以绘制一个中间的轴承结构。可以使用OpenGL的绘制几何体函数(如glutWireTorus())绘制一个环状结构。 6. 设置光照效果:可以使用OpenGL的光照函数(如glEnable(GL_LIGHTING)和glLightfv())来为轮子添加适当的光照效果,增强其视觉效果。 7. 渲染轮子:在完成上述绘制步骤后,将所有图形元素组合起来,并在OpenGL控件上进行渲染,使轮子显示在屏幕上。 以上是使用SharpGL绘制一个轮子的简要步骤说明,具体的实现过程可以根据个人的需求和具体应用场景进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白码上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值