C#根据整数ID从自定义对象列表创建唯一的校验和/哈希

时间:2019-07-09 09:26:23

标签: c#

我不确定我的术语是否正确,但是我正在考虑根据单个整数值(从技术上讲是数据库的主键)从自定义对象列表中创建一个校验和/哈希值。

用例是自定义对象列表,它实质上是对正在进行的各种事件的监视。这些事件被发送到GUI程序,该程序在屏幕上很好地显示它们。最好的方式是将其视为正在进行的事件的列表。

有时我会遇到由于网络问题而导致消息无法发送到GUI的问题,因此我正在寻找创建某种表示系统状态的识别值。然后可以将其随每条消息一起发送到GUI,如果该值与GUI存储的值不匹配,则GUI可以请求刷新事件列表。

任何指导将不胜感激。

更新

此外,我认为我可以提供一些我试图实现澄清的示例。

我的基类可能如下:-

public class BaseEvent {

    public DateTime EventDate { get;set;}
    public EventName EventName { get;set;}
    public int EventID { get;set;}

}

基础服务和GUI将具有一个集合,该服务为“主”

List<BaseEvent> _eventList = new List<BaseEvent>();

一项服务将生成事件并将其添加到列表中(以下示例-并非现实情况中的情况)

_eventList.Add(new BaseEvent() { EventID=1, EventName="Event 1", EventDate=DateTime.Now };

_eventList.Add(new BaseEvent() { EventID=2, EventName="Event 2", EventDate=DateTime.Now };

_eventList.Add(new BaseEvent() { EventID=3, EventName="Event 3", EventDate=DateTime.Now };

当服务器接收/处理每个事件时,会将它们从套接字发送到所有GUI客户端(所有类都是可序列化的)

每次将事件添加到列表或从列表中删除时,服务器都会将当前哈希存储在变量中。

public class SocketData {

    public BaseEvent CurrentEvent { get;set;}

    public int CurrentHash { get;set;}

}

因此,基于上面的内容以及将EventID加在一起的非常基本的哈希,将会发生以下情况

When Event 1 is sent the Current Hash would be 1
When Event 2 is sent the Current Hash would be 3 ( 1 + 2 )
When Event 3 is sent the Current Hash would be 6 ( 1 + 2 + 3 )

因此,目标是创建一种机制,以确保服务列表中所有项目的系统事件ID的“哈希”都是唯一的。

然后在GUI端,目标是从服务接收到消息时,它检查消息中接收到的哈希值,并将其与自己的哈希值进行比较,如果不匹配,它将向服务请求事件。

希望这可以澄清我要实现的目标。

谢谢。

1 个答案:

答案 0 :(得分:0)

您应该看看MD5 checksum。您可以ComputeHash处理任何流,因此,如果将列表序列化为流,就可以计算出哈希值。

byte[] GetMD5Checksum(List<int> list)
{
    var binaryFormatter = new BinaryFormatter();
    using(var stream = new MemoryStream())
    using (var md5 = MD5.Create())
    {
        binaryFormatter.Serialize(memoryStream, list);
        return md5.ComputeHash(stream);
    }
}