UH3L2——获取AB包文件的MD5码

本章代码关键字

1
2
3
4
5
6
System.Security.Cryptography        //安全和加密相关命名空间
MD5 //MD5码类
MD5CryptoServiceProvider //MD5加密服务提供商类
new MD5CryptoServiceProvider() //通过MD5加密服务提供商类的构造函数实例化一个继承MD5类对象的构造方法
md5.ComputeHash() //通过文件流获取md5码,返回16个字节的字节数组
byte.ToString("x2") //将字节数组转为小写16进制的字符

MD5码

MD5(Message-Digest Algorithm)是MD5信息摘要算法的简称,它是一种广泛使用的密码散列函数
可以生成出一个128位(16个字节)的散列值,用于确保信息的完整一致性

当我们将数据经过MD5算法计算过后,不管我们传入的数据有多大,都会生成一个固定长度(128位共16个字节)的信息摘要值

相同的数据,每次经过MD5算法计算后的结果都会是一样的,如果数据变化,MD5码将会发生变化

因此,我们可以利用MD5码作为文件的唯一标识,通过它来判断文件内容是否变化

MD5码在热更新资源对比文件中的作用

通过资源名或者资源大小我们无法判断资源是否更新,所以我们需要​**利用MD5的唯一性,来判断资源的更新**

C#中获取文件的MD5码

关键类:

  • 新知识

    • MD5​ —— MD5类
    • MD5CryptoServiceProvider​ —— MD5加密服务提供商类
  • 老知识

    • ​FileStream​ —— 文件流类 数据持久化四部曲 2进制中讲解过
    • ​StringBuilder​ —— 字符串拼接类 C#四部曲C#核心中讲过

获取MD5码流程:

  1. 根据文件路径,获取文件的流信息

    1
    using (FileStream file = new FileStream(filePath, FileMode.Open))
  2. 利用md5对象根据流信息,计算出MD5码(字节数组形式)

    1
    2
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] md5Info = md5.ComputeHash(file);
  3. 将字节数组形式的MD5码转为16进制字符串(byte​的ToString()​内传入"x2"​,会转为小写16进制)

    1
    2
    3
    for (int i = 0; i < md5Info.Length; i++)
    //关于md5Info[i].ToString()内的参数,如果传入X2就是大写的16进制,x2就是小写的
    sb.Append(md5Info[i].ToString("x2"));

读取指定路径下的luaAB包,输出它的MD5码

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
28
29
30
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

public class Lesson_MD5 : MonoBehaviour
{
void Start()
{
print(GetMD5(Application.dataPath + "/ArtRes/AB/PC/lua"));
}

private string GetMD5(string filePath)
{
using (FileStream file = new FileStream(filePath, FileMode.Open))
{
//声明一个MD5对象,用于生成MD5码
MD5 md5 = new MD5CryptoServiceProvider();
//利用API得到数据的MD5码 16个字节的数组
byte[] md5Info = md5.ComputeHash(file);
//把16个字节转换为16进制 拼接成字符串,为了减小md5码的长度
StringBuilder sb = new StringBuilder();
file.Close();
for (int i = 0; i < md5Info.Length; i++)
//关于md5Info[i].ToString()内的参数,如果传入X2就是大写的16进制,x2就是小写的
sb.Append(md5Info[i].ToString("x2"));
return sb.ToString();
}
}
}

输出如下:

image

向luaAB包添加了一个文件的输出如下:

image