unity在资源打包的时候,关于 hash 计算的简单总结

1、一般在计算资源hash的时候,需要考虑 :资源+资源meta、依赖项+依赖项meta

2、一般在计算资源hash的时候,都需要对计算结果进行加密,可以直接用C#自带的MD5进行加密

具体实现,代码如下(学习使用,结构并不完善):

 1 using System;
 2 using System.IO;
 3 using System.Collections.Generic;
 4 using UnityEditor;
 5 using UnityEngine;
 6 using System.Security.Cryptography;
 7 using System.Text;
 8 
 9 public class Test
10 {
11     [MenuItem("BuildTool/Lugs")]
12     static void LugsTest()
13     {
14         Debug.Log(ComputeAssetHash("Assets/UI/Prefab/ui_login/ui_login.prefab"));
15     }
16 
17     static string ComputeAssetHash(string assetPath)
18     {
19         if (!File.Exists(assetPath))
20             return null;
21 
22         List<byte> list = new List<byte>();
23 
24         //读取资源及其meta文件为字节数组
25         list.AddRange(GetAssetBytes(assetPath));
26 
27         //读取资源的依赖项及其meta文件为字节数组(依赖项本质也是资源的路径)
28         string[] dependencies = AssetDatabase.GetDependencies(assetPath);
29         for (int i = 0, iMax = dependencies.Length; i < iMax; ++i)
30             list.AddRange(GetAssetBytes(dependencies[i]));
31 
32         //如果资源有其他依赖项的话,也需要将其对应的字节数组读取到 list 中,然后再进行 哈希码 的计算
33 
34         //返回资源 hash
35         return ComputeHash(list.ToArray());
36     }
37 
38     static byte[] GetAssetBytes(string assetPath)
39     {
40         if (!File.Exists(assetPath))
41             return null;
42 
43         List<byte> list = new List<byte>();
44 
45         var assetBytes = File.ReadAllBytes(assetPath);
46         list.AddRange(assetBytes);
47 
48         string metaPath = assetPath + ".meta";
49         var metaBytes = File.ReadAllBytes(metaPath);
50         list.AddRange(metaBytes);
51 
52         return list.ToArray();
53     }
54 
55     static MD5 md5 = null;
56     static MD5 MD5
57     {
58         get
59         {
60             if (null == md5)
61                 md5 = MD5.Create();
62             return md5;
63         }
64     }
65 
66     static string ComputeHash(byte[] buffer)
67     {
68         if (null == buffer || buffer.Length < 1)
69             return "";
70 
71         byte[] hash = MD5.ComputeHash(buffer);
72         StringBuilder sb = new StringBuilder();
73 
74         foreach (var b in hash)
75             sb.Append(b.ToString("x2"));
76 
77         return sb.ToString();
78     }
79 
80    
81 }

结果如下:

原文地址:https://www.cnblogs.com/luguoshuai/p/11368052.html