首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetHashCode良好实践?

GetHashCode良好实践?
EN

Stack Overflow用户
提问于 2016-12-10 13:26:17
回答 1查看 1.2K关注 0票数 6

对于一个Delphi项目(由RAD XE7构建),我想创建一个笔刷字典。每个字典项都包含一个TMyBrush对象作为键,该对象描述要检索的画笔,以及一个GDI+画笔作为值。

TMyBrush类包含3个字段

  • 确定刷子种类的枚举类型(实心、梯度、.)
  • 描述画笔内容的TBrushInfo类(颜色、包装模式、.)
  • 表示钳位字段的TRect。

在我的字典里,我想根据他的特点,而不是根据他的情况检索一支刷子。例如,我希望从字典中获得一个黑色实心刷,方法是创建一个本地TMyBrush实例,将其配置为黑色实心,并使用TryGetValue()函数获得匹配的GDI+值。为此,我创建了一个TMyBrushComparer。

编写Equals()函数对我来说不是个问题。但是,我不知道编写GetHashCode()函数的最佳实践是什么。我倾向于写这样的函数:

代码语言:javascript
复制
function TMyBrushComparer.GetHashCode(const pValue: TMyBrush): Integer;
begin
    Result := BobJenkinsHash(pValue, SizeOf(TMyBrush), 0);
end;

但是我觉得那不是一个很好的做法,对吗?那么,为我的GetHashCode编写一个好的TMyBrushComparer ()函数的最佳实践是什么?

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-10 15:19:16

问题中的代码散列对象的地址,而不是它的值,因此不符合平等的定义。

你对平等的定义是三个字段是相等的。您的散列函数应该与该定义相匹配。散列这三个字段中的每一个,并组合这些值,例如使用以下方法:https://stackoverflow.com/a/263416/505088

您的两个字段是值类型。它们很容易散列以匹配值标识。刷子信息字段似乎是引用类型。因此,您需要再次确定您想要的标识形式(引用标识、值标识或其他身份),然后实现匹配的等式测试和哈希。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41076070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档