OCC 7.8.0 对TopoDS_Shape哈希码接口的调整

在OCC 7.6.0中,拓扑元素是可以直接获取其哈希码的,接口为

Standard_Integer TopoDS_Shape::HashCode	(	Standard_Integer 	theUpperBound	)	const

将项目更新为7.8.0之后,该函数报错,提示没有该成员函数

比较7.6.0和7.8.0的TopoDS_Shape.hxx的源代码,发现确实7.8.0中删除了该源码,但是仍然可以获取哈希值,只不过进行了调整

代码调整为如下:

namespace std
{
  template <>
  struct hash<TopoDS_Shape>
  {
    size_t operator()(const TopoDS_Shape& theShape) const noexcept
    {
      const size_t aHL = std::hash<TopLoc_Location>{}(theShape.Location());
      return aHL == 0 ? opencascade::hash(theShape.TShape().get())
                      : opencascade::MurmurHash::hash_combine(theShape.TShape().get(), sizeof(void*), aHL);
    }
  };
}

上述代码的思路如下:

1. hash<TopLoc_Location>调用TopoDS_Shape的Location方法返回值的哈希值。Location返回的是当前形状的位置信息。

2. 如果Location的哈希值是0(即没有定位信息),那么仅使用TShape的指针调用opencascade::hash函数来计算哈希值。

3. 如果Location的哈希值非0,那么调用opencascade::MurmurHash::hash_combine将TShape指针的内存地址和Location的哈希值结合起来生成最终的哈希值。hash_combine通常用于将多个哈希值合并成一个。

 如果还是想像之前一样获取某个拓扑元素的哈希值,应当如下方式获取:

size_t aHL = std::hash<TopoDS_Shape>{}(XXX)