哈希值(Hash Value),也叫散列值,是通过 哈希函数(Hash Function) 对任意长度的输入数据(如字符串、文件、二进制流等)进行计算后,得到的固定长度的输出值

可以把哈希函数理解为一个“数据搅拌机”:无论输入的是一滴水(小数据)还是一桶水(大数据),最终都会输出一勺固定大小的“粉末”(哈希值)。

核心特性

特性 说明
固定长度 无论输入数据多大,哈希值的长度由哈希算法决定,固定不变。例如 MD5 输出 128 位(16 字节),xxHash64 输出 64 位(8 字节)。
确定性 相同的输入 + 相同的哈希算法,必然得到相同的哈希值(无种子的情况下)。比如用 xxHash64 计算 "Unity",每次结果都一样。
雪崩效应 输入数据的微小变化(比如改一个字符),会导致哈希值发生巨大且不可预测的变化。例如 "Unity""unity" 的哈希值完全不同。
不可逆性 无法通过哈希值反推出原始输入数据(非加密哈希算法的不可逆性较弱,加密哈希算法如 SHA-256 不可逆性极强)。
低碰撞率 理想情况下,不同输入很难生成相同的哈希值(“碰撞”)。优秀的哈希算法(如 xxHash、SHA-256)碰撞概率极低。

哈希值的分类(按用途)

根据哈希算法的设计目标,哈希值主要分为两类:

  1. 非加密型哈希值
    • 算法代表:xxHash、CRC32、MurmurHash
    • 特点:计算速度极快,适合对性能要求高的场景,碰撞率低但不具备抗攻击能力。
    • 用途:数据校验、缓存键生成、哈希表索引、文件去重(如 Unity 资源缓存)。
  2. 加密型哈希值
    • 算法代表:SHA-256、SHA-3、MD5(已被破解,不推荐安全场景)
    • 特点:计算速度较慢,具备强抗碰撞、抗篡改能力,不可逆性强。
    • 用途:密码存储(需加盐)、数字签名、文件完整性验证(如软件下载校验)。

举个直观的例子

xxHash64 计算以下字符串的哈希值(种子为 0):

输入数据 xxHash64 哈希值(16 进制)
"Hello World" 0x7FBD6678A1A683CA
"Hello World!"(多一个感叹号) 0x8E945DB281A4A95C
"Unity Game Dev" 0x5D8A9A3E6C4F2B10

可以看到:

  • 输入长度不同,哈希值长度固定为 64 位(16 进制 16 个字符);
  • 输入仅差一个字符,哈希值完全不同(雪崩效应)。

在 Unity/C# 开发中的常见用途

对于游戏开发来说,哈希值的应用非常广泛,比如:

  1. 资源缓存管理:计算资源文件(如 Prefab、Texture)的哈希值,作为缓存键,避免重复加载相同资源。
  2. 网络数据校验:传输游戏数据时,附带哈希值,接收方通过对比哈希值判断数据是否被篡改或传输错误。
  3. 哈希表/字典索引:C# 中的 Dictionary<TKey, TValue> 底层就是通过计算 Key 的哈希值来实现高效查找。
  4. 存档防篡改:对存档文件计算加密哈希值(如 SHA-256),防止玩家手动修改存档数据。