【问题标题】:What's an effective and processing-cheap algorithm for generating ETags?生成 ETag 的有效且处理成本低的算法是什么?
【发布时间】:2015-09-29 15:12:53
【问题描述】:

我有一个 REST API(内置于 Nancy,在 ASP.NET 上运行)可以返回如下 JSON 对象:

{
   id: "1",
   name: "Fred",
   reviews: [
     {
        id: "10",
        content: "I love Stack Overflow"
     }
   ]
}

注意这个对象不是一个直接的实体,而是一个表示。

通常,我会使用数据库中实体的最后修改/时间戳作为 ETag,然后当它更新时,ETag 也会更新。简单的。

但是在这种情况下,如果用户没有改变,但第一次评论的内容发生了变化怎么办?使用前面提到的 ETag 逻辑,它不会改变。我们这里有一个案例,其中表示包含多个实体,我正在尝试找到一种唯一标识它的方法。

所以我需要以某种方式识别该表示(这是一个简单的 C# POCO,存储在 Redis 缓存中)。

这是我最初的想法:

  • Object.GetHashCode()。不起作用,因为内存引用总是不同的。
  • 内存流对象,SHA1 散列它。每次都做起来成本很高。
  • 在我添加/更新缓存之前,创建一个用于 ETag 的 GUID 并将其也存储在缓存中。然后,当缓存 get 被刷新时(在前面的示例中就是这样),会生成一个新的 GUID 并更新 ETag。这种方法的问题是我将我的 ETag 机制绑定到我的缓存实现(所以不是松散耦合)。

谁能想到一种廉价/有效的方法来做到这一点,最好是在全球范围内? (例如 Object 或基础对象,而不是每个实体/资源的特定 ETag 生成逻辑)。

非常感谢!

【问题讨论】:

    标签: c# rest http nancy etag


    【解决方案1】:

    我认为散列方法还不错。我会考虑使用非常高效的哈希算法,例如 MurmurHash3(128 位版本)和 xxHash(64 位版本)。这是一种有效的方式来做这件事,但不幸的是它不是最便宜的。您可以找到 c# 实现 herehere

    您说数据库中的每个实体都有一个修改过的时间戳。如果模型由多个实体组成,则模型 ETag 可以从实体时间戳导出。模型 ETag 将是实体时间戳的串联。这种方法效率更高,但您不能全局执行,您需要为每个模型编写特定的代码。

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2020-10-14
      • 2012-01-21
      • 2011-08-12
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多