有没有办法从 Guid 列表中生成 Guid?

Is there a way to generate a Guid from a list of Guids?

我有一个对象列表,它们具有 id 的 guid。我想使用这个对象列表中的 id 创建一个 guid,我可以使用它来确保列表没有改变。如果对象是 removed/added,则 guid 会有所不同。我想到的是使用哈希。也许我应该只使用散列,但我想知道这是否可能比生成散列更快?

编辑: 我从存储过程中获取此列表。然后将对象列表存储到内存缓存中。每个用户都将根据这个生成的值验证他们在 cookie 中的本地值,以确保列表仍然相同。

您可以编写自己的 class 来访问列表或哈希集或支持此的任何其他集合:

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 中发送。

注意:根据您的要求,您可能需要 encrypt/sign cookie 值(可能加盐)以防止客户端代码篡改您的 cookie 值。