【问题标题】:Is there a way to generate a Guid from a list of Guids?有没有办法从 Guid 列表中生成 Guid?
【发布时间】:2015-08-19 06:32:34
【问题描述】:

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

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

【问题讨论】:

  • 哈希对我来说听起来不错。
  • 为什么不用自己的添加/删除函数子类或包装一个列表?
  • @AlexeiLevenkov 这样做更清楚了。
  • @DeadlyChambers 我现在看到 - 我认为您应该寻找某种“最后更改”/“数据版本”自动增量值来与来自 DB 的数据一起...任何哈希kind 不保证唯一性,所以如果正确性是任何类型的要求哈希都不起作用。
  • @AlexeiLevenkov 我最终得到了一个 guid,只是从缓存中的列表中得到了一个,但你让我到了那里。

标签: c# hash guid


【解决方案1】:

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

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
    }

}

这是一种信息隐藏形式。

【讨论】:

  • 啊,我明白了。我将这个对象列表存储在内存缓存中,所以我们只是要使缓存无效。
  • 在这种模式下应该很容易做到。
  • Guid 的添加和删除不会以这种方式发生。我需要一个标识列表的值。再次,也许我只需要去散列。
  • @DeadlyChambers 散列对缓存失效没有多大帮助 - 跟踪更改(如本答案所示)或使用不可变数据结构可能是更好的方法。
  • @DeadlyChambers 你可以这样做——这只是一个例子。因为你控制了这个类,你可以设计它希望它如何工作。
【解决方案2】:

当您需要知道对象是否与之前完全一样时,您不能单独依赖散列 - 对象的散列可以让您明确告诉对象不同,但不能保证对象相同。

通常有几种方法可以解决这个问题:

  • 哈希值的潜在冲突率通常很小是可以接受的,您可以使用足够长的哈希值来满足您的要求。通常,像 SHA256 这样的加密哈希函数提供足够低的冲突率来适应它。如果需要,这样的值很容易适合 HTTP cookie。
  • 如果对象足够小(即几个 K),则可以选择将整个对象发送到客户端(让您有机会对回发进行精确比较)。
  • 如果您可以以某种方式明确地对对象进行版本控制,以保证特定对象的唯一性(修改日期、当前具有自动增量的顺序更新),您可以只保留该信息。通常这种版本信息很小,很容易在 cookie 中发送。

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

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2021-04-05
    • 2012-08-08
    相关资源
    最近更新 更多