Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法从Guid列表生成Guid?_C#_Hash_Guid - Fatal编程技术网

C# 有没有办法从Guid列表生成Guid?

C# 有没有办法从Guid列表生成Guid?,c#,hash,guid,C#,Hash,Guid,我有一个对象列表,它们有ID的GUID。我想使用此对象列表中的ID创建一个可以使用的guid,以确保列表没有更改。如果删除/添加了对象,则guid将不同。我想到的是使用散列。也许我应该使用散列,但我想知道这是否可能比生成散列更快 编辑: 我从存储过程中获取此列表。然后将对象列表存储到内存缓存中。每个用户将根据生成的值验证cookie中的本地值,以确保列表仍然相同 您可以编写自己的类来访问列表、哈希集或支持此操作的任何其他集合: class GuidList // You can implemen

我有一个对象列表,它们有ID的GUID。我想使用此对象列表中的ID创建一个可以使用的guid,以确保列表没有更改。如果删除/添加了对象,则guid将不同。我想到的是使用散列。也许我应该使用散列,但我想知道这是否可能比生成散列更快

编辑:
我从存储过程中获取此列表。然后将对象列表存储到内存缓存中。每个用户将根据生成的值验证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您可以这样做-这只是一个示例。既然你控制这个类,你就可以按照你想要的方式来设计它。