#codec #base58 #decoding #port #array #32-byte

无std five8

针对32字节和64字节数组的快速base58编码和解码

1个不稳定版本

0.1.0 2024年7月29日

#693编码

Download history 129/week @ 2024-07-28 2/week @ 2024-08-04

每月131次下载

MIT 许可证

89KB
1.5K SLoC

five8

five8 提供了针对32字节和64字节数组的快速base58编码和解码。它是 fd_base58 的Rust版本。公共API中有四个函数:

  • encode_32
  • encode_64
  • decode_32
  • decode_64

示例

编码

let mut buf = [0u8; 44];
let mut len = 0u8;
let bytes = &[
    24, 243, 6, 223, 230, 153, 210, 8, 92, 137, 123, 67, 164, 197, 79, 196, 125, 43, 183, 85,
    103, 91, 232, 167, 73, 131, 104, 131, 0, 101, 214, 231,
];
five8::encode_32(bytes, Some(&mut len), &mut buf);
assert_eq!(
    &buf[..len as usize],
    [
        50, 103, 80, 105, 104, 85, 84, 106, 116, 51, 70, 74, 113, 102, 49, 86, 112, 105,
        100, 103, 114, 89, 53, 99, 90, 54, 80, 117, 121, 77, 99, 99, 71, 86, 119, 81, 72,
        82, 102, 106, 77, 80, 90, 71
    ]
);
assert_eq!(len, 44);

解码

fn example_decode_32() {
    let bytes = b"2gPihUTjt3FJqf1VpidgrY5cZ6PuyMccGVwQHRfjMPZG";
    let mut out = [0u8; 32];
    five8::decode_32(bytes, &mut out).unwrap();
    assert_eq!(
        out,
        [
            24, 243, 6, 223, 230, 153, 210, 8, 92, 137, 123, 67, 164, 197, 79, 196, 125, 43,
            183, 85, 103, 91, 232, 167, 73, 131, 104, 131, 0, 101, 214, 231
        ]
    );
}

基准测试

这些基准测试是在支持AVX2的笔记本电脑上运行的。如果你的机器不支持AVX2指令,它将运行得更慢,但应该仍然比其他替代方案更快 - 请参阅禁用AVX2的第二组基准测试。

启用AVX2 (RUSTFLAGS='-C target-cpu-native)

基准测试 five8 Lou-Kamades/fd_bs58 bs58-rs
decode_32 36 ns 88 ns 291 ns
decode_64 124 ns 203 ns 1092 ns
encode_32 55 ns 96 ns 682 ns
encode_64 102 ns 209 ns 2781 ns

禁用AVX2(默认 RUSTFLAGS

基准测试 five8 Lou-Kamades/fd_bs58 bs58-rs
decode_32 49 ns 107 ns 320 ns
decode_64 162 ns 246 ns 1176 ns
encode_32 86 ns 98 ns 824 ns
encode_64 179 ns 219 ns 3370 ns

另请参阅

five8_const:编译时base58解码。

依赖关系