• 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 }

    结果如下:

  • 相关阅读:
    JSON 数字排序 多字段排序
    hdu-4747-Mex
    Android SDK更新缓慢或无法更新的解决方法
    UVA 11806
    SDL显示内存中的图像
    Cocos2d-x 2.1.5 简单动画
    codeforce343A
    android 控件的移动
    Erlang千万级用户游戏框架(Openpoker)源码文件分析清单
    八大排序c++可运行精简版,一目了然
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/11368052.html
Copyright © 2020-2023  润新知