You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Blake2B 128哈希结果不匹配问题求助

问题:Blake2B 128哈希结果不符的解决方法

我有如下十六进制字符串:0x6469643a737369643a7465737432343700000000000000000000000000000000,尝试通过Blake2B 128进行哈希转换。

预期结果:0x017d8f165615146b5af43b037ee14db4

但我的代码运行后得到的结果是:6a3f369054a2150757e7a4a8a6f59996

代码实现:

let newData = try encodedHexData.blake2b(128)
let newHex = newData.toHexString()
print("HEX::: ", newHex)

func blake2b(_ size: Int) throws -> Data {
    do {
        var hasher = try Blake2(.b2b, size: size / 8)
        hasher.update(self)
        
        return try hasher.finalize()
    } catch {
        throw error
    }
}

请问正确的实现方式应该是什么?

参考了substrate-client-swift和fearless-utils-iOS的内容。


问题原因与修正方案

结果不符的核心原因是:Substrate生态中使用的Blake2b-128是带**空密钥+个人化参数"SSHA256"**的定制版本,而非标准无参数的Blake2b哈希。

正确的Swift实现

extension Data {
    func blake2b128Substrate() throws -> Data {
        // Substrate专属Blake2b-128配置:空密钥,个人化参数为"SSHA256"
        let personalization = "SSHA256".data(using: .utf8)!
        var hasher = try Blake2(.b2b, size: 16, key: Data(), personalization: personalization)
        hasher.update(self)
        return try hasher.finalize()
    }
}

// 使用示例
let targetHex = "6469643a737369643a7465737432343700000000000000000000000000000000"
guard let inputData = Data(hexString: targetHex) else {
    fatalError("无效的十六进制字符串")
}
do {
    let hashData = try inputData.blake2b128Substrate()
    let resultHex = "0x" + hashData.toHexString()
    print("HEX::: ", resultHex) // 输出预期的0x017d8f165615146b5af43b037ee14db4
} catch {
    print("哈希失败:", error)
}

关键说明

  • 必须指定个人化参数"SSHA256",这是Substrate对Blake2b-128的定制要求,也是和标准哈希结果差异的根本原因。
  • 确保使用的Blake2库支持设置个人化参数(比如substrate-client-swift或fearless-utils-iOS中封装的实现)。

内容的提问来源于stack exchange,提问作者Abhishek Thapliyal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:10:12