我不确定我的术语是否正确,但是我正在考虑根据单个整数值(从技术上讲是数据库的主键)从自定义对象列表中创建一个校验和/哈希值。
用例是自定义对象列表,它实质上是对正在进行的各种事件的监视。这些事件被发送到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端,目标是从服务接收到消息时,它检查消息中接收到的哈希值,并将其与自己的哈希值进行比较,如果不匹配,它将向服务请求事件。
希望这可以澄清我要实现的目标。
谢谢。
答案 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);
}
}