C# 有没有办法从Guid列表生成Guid?
我有一个对象列表,它们有ID的GUID。我想使用此对象列表中的ID创建一个可以使用的guid,以确保列表没有更改。如果删除/添加了对象,则guid将不同。我想到的是使用散列。也许我应该使用散列,但我想知道这是否可能比生成散列更快 编辑:C# 有没有办法从Guid列表生成Guid?,c#,hash,guid,C#,Hash,Guid,我有一个对象列表,它们有ID的GUID。我想使用此对象列表中的ID创建一个可以使用的guid,以确保列表没有更改。如果删除/添加了对象,则guid将不同。我想到的是使用散列。也许我应该使用散列,但我想知道这是否可能比生成散列更快 编辑: 我从存储过程中获取此列表。然后将对象列表存储到内存缓存中。每个用户将根据生成的值验证cookie中的本地值,以确保列表仍然相同 您可以编写自己的类来访问列表、哈希集或支持此操作的任何其他集合: class GuidList // You can implemen
我从存储过程中获取此列表。然后将对象列表存储到内存缓存中。每个用户将根据生成的值验证cookie中的本地值,以确保列表仍然相同 您可以编写自己的类来访问列表、哈希集或支持此操作的任何其他集合:
class GuidList // You can implement IReadOnlyList
{
public bool Dirty { get; private set;}
// Omit if implementing `IReadOnlyList`
public Guid[] Guids { get { return guidCollection.ToArray() }
public void Add(Guid guid) // Do similarly for remove
{
Dirty = true;
// implement logic
}
}
这是信息隐藏的一种形式。当您需要知道对象是否与以前完全相同时,您不能仅依靠散列-对象的散列可以明确地告诉您对象是不同的,但不能保证对象是相同的 通常有几种方法可以解决这一问题:
- 通常,哈希值上可能发生的小冲突率是可以接受的,您可以使用足够长的哈希值来满足您的需求。通常,像SHA256这样的加密散列函数提供足够低的冲突率,以适应它。如果需要,这种值将很容易地放入HTTP cookie中
- 如果对象足够小(即几个K),则可以选择将整个对象发送到客户端(这将使您有机会对回发执行精确的比较)
- 如果您能够以某种方式明确地对特定对象的对象进行版本设置,并保证该对象是唯一的(修改日期、当前自动递增的顺序更新),那么您就可以保留该信息。通常,这样的版本控制信息很小,很容易在cookie中发送李>
注意:根据您的要求,您可能需要加密/签署cookie值(可能使用salt)防止客户端代码篡改您的cookie值。哈希对我来说很好。为什么不使用自己的添加/删除函数对列表进行子类化或包装?@AlexeiLevenkov这样做更清楚。@DeadlyChambers我现在看到了-我想您应该寻找某种“上次更改”/“数据版本”与数据库中的数据一起自动增加的值。。。任何类型的散列都不能保证唯一性,所以如果正确性是任何类型的需求散列都不起作用。@AlexeiLevenkov我最终得到了一个guid,它只是从缓存中随列表而来,但你把我带到了那里。啊,是的,我看到了。我将此对象列表存储在内存缓存中,因此我们将使缓存无效。在这种模式下,这应该很容易做到。GUI的添加和删除不会以这种方式进行。我需要一个标识列表的值。同样,也许我只需要去哈希。@DeadlyChambers哈希对缓存失效没有多大帮助-跟踪更改(如本答案所示)或使用不可变数据结构可能是更好的方法。@DeadlyChambers您可以这样做-这只是一个示例。既然你控制这个类,你就可以按照你想要的方式来设计它。