代码之家  ›  专栏  ›  技术社区  ›  Rex M

哈希表达式树

  •  3
  • Rex M  · 技术社区  · 17 年前

    我正在努力将一些伪智能缓存构建成 LINQ query provider

    3 回复  |  直到 17 年前
        1
  •  -1
  •   Tim Jarvis    17 年前

    您可能可以使用这里提供的代码来完成。 http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/

    这展示了如何解决闭包问题,并支持本地集合。

        2
  •  1
  •   tpdi    17 年前

    让我们想想这个。大概你想把(表达式树的哈希值,结果)存储在映射中。

    当你得到一个表达式树时,你会对它进行哈希运算,然后在映射中查找结果,这会导致两种可能性:

    1. 这是一个地图上没有的哈希,一个你以前从未见过的哈希。你必须让这个运行,因为你没有缓存的结果。

    2. 它是映射中的哈希值,但由于您没有在映射中存储生成哈希值的旧表达式树,因此无法将新传递的表达式与旧表达式进行比较。你可能有比赛,也可能有碰撞, 但无法区分这两种可能性。 您无法返回缓存的结果,因为这可能是冲突。

    hashATree:
    if leaf node
      return hash(node)
    else
      return hash(node) *OP* hashATree(left.child) *OP* hashATree(right.child)
    

    哪里 是某种运算(可能是乘法),或者更一般地说 hash(node) *OP* accumulate( children.begin(), children.end(), *OP* );

    node.eval( children); )

        3
  •  1
  •   Pete Montgomery    15 年前

    嗯,实际上我认为这可能很简单。

    Expression对象的ToString()方法将为您提供Expression的文本表示,如果您只想计算键的等效性,则可以对其进行哈希运算。