簡體   English   中英

在 C# 中生成 class 結構的 hash

[英]Generating hash of a class structure in C#

我們的應用程序使用 state 的序列化快照,它只是 class 在某個時間點的序列化版本。

我們在 class 上有一個版本號,每次修改 class 時我們都會增加一個版本號,我們使用它來指示以前的快照無效並忽略它們。

偶爾有人忘記增加版本,我們會得到錯誤。

我想為 class 的結構生成 hash 並使用它來存儲快照,因此如果它發生更改,那么以前的快照將自動失效。

我已經考慮過使用 Roslyn 加載 class 的表示並在其上調用 GetHashCode,但無法弄清楚如何將現有的 class 加載到 Roslyn 中。

我還研究了 Visual Studio 在構建時生成哈希: https://docs.microsoft.com/en-us/archive/msdn-magazine/2017/march/visual-studio-hashing-source-code-files- with-visual-studio-to-assure-file-integrity但這似乎有點矯枉過正。

那么如何生成現有 C# class 結構的 hash 結構(不是類的實例)?

更新:

這是一個沒有方法的 POCO。 使快照無效的更改包括添加、刪除或重命名屬性。

我建議使用反射來獲得它。

類似於以下內容:

private int GetHashOfClass(Type myType)
{
    int hash = 0;
    foreach (var f in myType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic))
    {
        if (f.MemberType == MemberTypes.Field ||
            (f.MemberType & MemberTypes.Property) != 0)
        {
            hash ^= CreateHash(f.Name);
        }

        if (f is FieldInfo fi)
        {
            hash ^= CreateHash(fi.FieldType.Name);
        }
    }

    return hash;
}

這會從 class 的字段和屬性生成哈希碼。 CreateHash只是一個 function 從字符串生成 hash。 不要使用現有的string.GetHashCode ,因為每次啟動應用程序時,function 的結果都會改變。

您可以使用 JSchemaGenerator(來自 Newtonsoft.Json.Schema nuget):

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

JSchemaGenerator generator = new JSchemaGenerator();

string schema = generator.Generate(typeof(Person)).ToString();
//{
//  "type": "object",
//  "properties": {
//    "Name": {
//      "type": [ "string", "null" ]
//    },
//    "Age": { "type": "integer" }
//  },
//  "required": [ "Name", "Age" ]
//}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM