🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **Multihash** Multihash 在ipfs中被广泛应用。 定义如下: Multihash is a protocol for differentiating outputs from various well-established hash functions, addressing size + encoding considerations. It is useful to write applications that future-proof their use of hashes, and allow multiple hash functions to coexist. 简单翻译如下: Multihash 是一种协议,用于区分各种成熟哈希函数的输出,解决大小+编码的实际问题。 编写应用程序来保证它们对哈希的使用永不过时,并允许多个哈希函数共存是很有用的。 采用Mutihash的根本原因是,有时哈希算法可能被证明是不安全的,这意味着它不再符合我们先前定义的特征(如一无二的、不可逆转、不会被破解等)。这已经在sha1发生了(目前不同的明文通过MD5或SHA1后,可以生成相同的数字摘要,从而导致暴力破解的概率加大,从而造成不安全) 。随着时间的流逝,其他算法可能证明不足以实现IPFS和其他分布式信息系统中的内容寻址。因此,为了支持多种密码算法,我们需要能够知道使用哪种算法来生成特定内容的哈希。 由此,Multihash 应运而生。 Multihash 由hash算法名称+hash值长度+hash值共同构成。 multihash 是自描述散列本身包含描述其两个长度和什么加密算法生成的它的元数据。系统使用Mutihah具有永不过时的功能,因为它们使用多重哈希来支持多种哈希算法,而不是依赖特定的哈希算法。 多重哈希遵循TLV 模式(type-length-value)。本质上,“原始哈希”的前缀是type所应用的哈希算法类型和hash的length。 * `type`:所述的识别码的加密算法来生成的散列(例如的标识符`sha2-256`将是`18`\-`0x12`在十六进制) -参见multicodec 表对于所有标识符 * `length`:哈希的实际长度(如果使用`sha2-256`它将是`256`位,等于32个字节) * `value`:实际的哈希值 在ipfs的节点标识(identity)上,节点唯一标识为节点公钥的mutihash。计算其mutihash时,type为IDENTITY(十六进制的0x00)或SHA2_256(十六进制0x18): ``` func IDFromPublicKey(pk ic.PubKey) (ID, error) {     b, err := ic.MarshalPublicKey(pk) if err != nil { return "", err } var alg uint64 = mh.SHA2_256 if AdvancedEnableInlining && len(b) <= maxInlineKeyLength { alg = mh.IDENTITY }   hash, _ := mh.Sum(b, alg, -1) return ID(hash), nil } ``` 根据ipfs文档说明,采用IDENTITY的type,是为向后兼容,未来会废弃(也就是将AdvancedEnableInlining置为false),这样,未来根据公钥产生的ID的hash type将是SHA2_256。