#metadata #hashing #u16 #type-hash #derive #type-compatibility

no-std tysh

此包帮助对类型的元数据进行哈希处理

2个版本

0.1.1 2023年3月25日
0.1.0 2023年3月25日

#1318编码

每月22次下载

Apache-2.0

15KB
264

tysh

crates.io

Tysh是帮助处理类型元数据哈希的crate。

目的

Tysh是一个旨在与bincodecrate一起使用的工具,该crate帮助序列化数据。尽管bincodecrate与某些数据结构(例如Color { r: u8, g: u8, b: u8 }Color { b: u8, g: u8, r: u8 }结构具有相同的类型结构并且与JSON序列化兼容),但在序列化和反序列化过程中可能会改变数据的含义。为了避免这个问题,tysh还提供了字段名称以及类型信息,这有助于确保不同版本的数据结构之间的兼容性。

如何使用

use tysh::TypeHash;

#[derive(TypeHash)]
struct A {
    a: u8,
    b: u16,
}

这将生成以下代码

struct A {
    a: u8,
    b: u16,
}
impl ::tysh::TypeHash for A {
    fn type_hash<H: ::core::hash::Hasher>(hasher: &mut H) {
        use ::core::hash::Hash;
        "@struct@".hash(hasher);
        "A".hash(hasher);
        "@field@".hash(hasher);
        "a".hash(hasher);
        <u8 as ::tysh::TypeHash>::type_hash(hasher);
        "@field@".hash(hasher);
        "b".hash(hasher);
        <u16 as ::tysh::TypeHash>::type_hash(hasher);
    }
}

您还可以使用#[type_hash(name = "name")]属性来指定内部名称。

use tysh::TypeHash;

#[derive(TypeHash)]
#[type_hash(name = "AnotherName")]
struct A {
    a: u8,
    #[type_hash(name = "another special name")]
    b: u16,
}
pub struct A {
    a: u8,
    b: u16,
}
impl ::tysh::TypeHash for A {
    fn type_hash<H: ::core::hash::Hasher>(hasher: &mut H) {
        use ::core::hash::Hash;
        "@struct@".hash(hasher);
        "AnotherName".hash(hasher);
        "@field@".hash(hasher);
        "a".hash(hasher);
        <u8 as ::tysh::TypeHash>::type_hash(hasher);
        "@field@".hash(hasher);
        "another special name".hash(hasher);
        <u16 as ::tysh::TypeHash>::type_hash(hasher);
    }
}

依赖关系

~315–790KB
~19K SLoC