3.上传相关-获取AB包文件的MD5码
3.1 知识点
MD5码是什么
- MD5(Message-Digest Algorithm)是一种密码散列函数,简称MD5信息摘要算法。
- 它可以生成一个128位(16个字节)的散列值,用于确保信息的完整一致性。
- 当数据经过MD5算法计算后,不管数据大小如何,都会生成一个固定长度的信息摘要值。
- 相同的数据每次经过MD5算法计算后的结果都会一样,如果数据发生变化,MD5码将会发生变化。
- 因此,可以利用MD5码作为文件的唯一标识,以判断文件内容是否变化。
MD5码在热更新资源对比文件中的作用
- 通过资源名或者资源大小无法判断资源是否更新,因此需要利用MD5的唯一性来判断资源的更新。
C#中获取文件的MD5码
使用到的类
MD5 MD5类
MD5CryptoServiceProvider MD5加密服务提供商类
FileStream 文件流类
StringBuilder 字符串拼接类
使用到的方法类
Md5.ComputeHash 得到数据的MD5码返回一个字节数组
主要步骤
- 根据文件路径,获取文件的流信息。
- 利用MD5对象根据流信息计算出MD5码(字节数组形式)。
- 将字节数组形式的MD5码转换为16进制字符串。
代码实现
print(GetMD5(Application.dataPath + "/ArtRes/AB/PC/lua"));
//4d52bb62ee05623efccf94773f53e2c1
private string GetMD5(string filePath)
{
// 将文件以流的形式打开
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
// 声明一个MD5对象用于生成MD5码
MD5 md5 = new MD5CryptoServiceProvider();
// 利用ComputeHash方法得到数据的MD5码,返回一个字节数组
byte[] md5Info = md5.ComputeHash(fileStream);
// 关闭文件流
fileStream.Close();
// 将字节数组形式的MD5码转换为16进制字符串
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < md5Info.Length; i++)
{
// 将字节数组中的每个字节转换为两位的16进制字符串,并追加到stringBuilder中 x2代表转成16进制
stringBuilder.Append(md5Info[i].ToString("x2"));
}
// 返回生成的MD5字符串
return stringBuilder.ToString();
}
}
3.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class Lesson03_上传相关_获取AB包文件的MD5码 : MonoBehaviour
{
void Start()
{
#region 知识点一 MD5码是什么
//MD5(Message-Digest Algorithm)是
//MD5信息摘要算法的简称
//它是一种广泛使用的密码散列函数
//可以生成出一个128位(16个字节)的散列值
//用于确保信息的完整一致性
//当我们将数据经过MD5算法计算过后
//不管我们传入的数据有多大
//都会生成一个固定长度(128位共16个字节)的信息摘要值
//相同的数据,每次经过MD5算法计算后的结果都会是一样的
//如果数据变化,MD5码将会发生变化
//因此,我们可以利用MD5码作为文件的唯一标识
//通过它来判断文件内容是否变化
#endregion
#region 知识点二 MD5码在热更新资源对比文件中的作用
//通过资源名或者资源大小我们无法判断资源是否更新
//所以我们需要利用MD5的唯一性,来判断资源的更新
#endregion
#region 知识点三 C#中获取文件的MD5码
//关键类:
//新知识
//MD5 —— MD5类
//MD5CryptoServiceProvider —— MD5加密服务提供商类
//老知识
//FileStream —— 文件流类 数据持久化四部曲 2进制中讲解过
//StringBuilder —— 字符串拼接类 C#四部曲C#进阶中讲过
//流程:
//1.根据文件路径,获取文件的流信息
//2.利用md5对象根据流信息 计算出MD5码(字节数组形式)
//3.将字节数组形式的MD5码转为 16进制字符串
print(GetMD5(Application.dataPath + "/ArtRes/AB/PC/lua"));
#endregion
}
private string GetMD5(string filePath)
{
//将文件以流的形式打开
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
//声明一个MD5对象 用于生成MD5码
MD5 md5 = new MD5CryptoServiceProvider();
//利用ComputeHash方法这个API 得到数据的MD5码 16个字节 数组
byte[] md5Info = md5.ComputeHash(fileStream);
//关闭文件流
fileStream.Close();
//把16个字节转换为 16进制 拼接成字符串 为了减小md5码的长度
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < md5Info.Length; i++)
stringBuilder.Append(md5Info[i].ToString("x2"));
return stringBuilder.ToString();
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com