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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值