在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)