Multihash

Swift Package Manager compatible Build & Test (macos and linux)

Multihash 的 Swift 实现 -> 自我识别哈希

目录

概述

Multihash 是一种协议,用于区分来自各种成熟的密码哈希函数的输出,并解决大小和编码方面的考虑。

更多详情请参阅

注意

此软件包目前不支持 Blake2b、Blake2s 和 Blake3。如果您愿意接受挑战,请随时添加支持!

安装

在您的 Package.swift 文件中包含以下依赖项

let package = Package(
    ...
    dependencies: [
        ...
        .package(url: "https://github.com/swift-libp2p/swift-multihash.git", .upToNextMajor(from: "0.0.1"))
    ],
    ...
        .target(
            ...
            dependencies: [
                ...
                .product(name: "Multihash", package: "swift-multihash"),
            ]),
    ...
)

用法

示例

import Multihash

/// Multihash Format 
/// <varint hash function code><varint digest size in bytes><hash function output>

Multihash.supportedHashAlgorithms
/// [.md5, .sha1, .sha2_256, .sha2_512, .sha3_224, .sha3_256, .sha3_384, .sha3_512, .keccak_224, .keccak_256, .keccak_384, .keccak_512]

/// Encoding a Multihash
let multihash = try Multihash(raw: "multihash", hashedWith: .sha1)
multihash.asString(base: .base16)         // -> "111488c2f11fb2ce392acb5b2986e640211c4690073e"
multihash.asString(base: .base32PadUpper) // -> "CEKIRQXRD6ZM4OJKZNNSTBXGIAQRYRUQA47A===="
multihash.asString(base: .base58btc)      // -> "5dsgvJGnvAfiR3K6HCBc4hcokSfmjj"
multihash.asString(base: .base64Pad)      // -> "ERSIwvEfss45KstbKYbmQCEcRpAHPg=="

let multihash = try Multihash(raw: "multihash", hashedWith: .sha2_256)
multihash.asString(base: .base16)         // -> "12209cbc07c3f991725836a3aa2a581ca2029198aa420b9d99bc0e131d9f3e2cbe47"
multihash.asString(base: .base32PadUpper) // -> "CIQJZPAHYP4ZC4SYG2R2UKSYDSRAFEMYVJBAXHMZXQHBGHM7HYWL4RY="
multihash.asString(base: .base58btc)      // -> "QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk"
multihash.asString(base: .base64Pad)      // -> "EiCcvAfD+ZFyWDajqipYHKICkZiqQgudmbwOEx2fPiy+Rw=="

/// Decoding a Multihash

/// Given a Multibase compliant Multihash String
/// 
/// Example
/// "f111488c2f11fb2ce392acb5b2986e640211c4690073e"
///     f       11      14     88c2f11fb2ce392acb5b2986e640211c4690073e
/// <base16> <sha1> <20 bits> <sha1 digest>

let mh = try Multihash(multihash: "f111488c2f11fb2ce392acb5b2986e640211c4690073e")
print(mh.name) // -> "sha1"
print(mh.code) // ->  0x11
print(mh.digest.hexString) // -> "88c2f11fb2ce392acb5b2986e640211c4690073e"

/// Or use the try decodeMultihashBuffer() method

let multihashBuffer = Data(...)           // -> 111488c2f11fb2ce392acb5b2986e640211c4690073e
let decoded = try decodeMultihashBuffer(multihashBuffer)
decoded.name                              // -> "sha1"
decoded.code                              // -> 0x11
decoded.digest                            // -> 88c2f11fb2ce392acb5b2986e640211c4690073e (as hex)
decoded.length                            // -> 20

API

/// Initializers
Multihash(multihash:String) throws 
Multihash(:[UInt8]) throws
Multihash(hexString str:String) throws
Multihash(b58String str:String) throws
Multihash(multibase:String, codec:Codecs) throws


/// Properties
Multihash.code:Int?
Multihash.algorithm:Codecs?
Multihash.name:String?
Multihash.length:Int?
Multihash.digest:[UInt8]?

Multihash.asMultibase(_ base: BaseEncoding) -> String
Multihash.asString(base: BaseEncoding) -> String

Multihash.hexString:String
Multihash.b58String:String

贡献

欢迎贡献!此代码很大程度上是一个概念验证。我可以向您保证,有更好/更安全的方法来实现相同的结果。欢迎任何建议、改进,甚至是批评!

让我们一起让这段代码变得更好!🤝

鸣谢

许可

MIT © 2022 Breth Inc.