首页 文章

GetHashCode的好习惯?

提问于
浏览
6

对于Delphi项目(使用RAD Studio XE7构建),我想创建一个画笔字典 . 每个字典项包含一个TMyBrush对象作为键,描述要检索的画笔,以及GDI画笔作为值 .

TMyBrush类包含3个字段

  • 用于确定画笔类型的枚举类型(实体,渐变,...)

  • 描述画笔内容的TBrushInfo类(颜色,换行模式......)

  • 表示钳位字段的TRect

在我的字典中,我想根据他的特征检索画笔,而不是他的实例 . 例如,我希望通过创建本地TMyBrush实例,将其配置为黑色实体,并使用TryGetValue()函数获取匹配的GDI值,从我的字典中获取黑色实体画笔 . 为此,我创建了一个TMyBrushComparer .

编写Equals()函数对我来说不是问题 . 但是我不知道编写GetHashCode()函数的最佳做法是什么 . 我倾向于写一个这样的函数:

function TMyBrushComparer.GetHashCode(const pValue: TMyBrush): Integer;
begin
    Result := BobJenkinsHash(pValue, SizeOf(TMyBrush), 0);
end;

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

问候

1 回答

  • 5

    问题中的代码会散列对象的地址而不是其值,因此与您的相等定义不一致 .

    你对平等的定义是三个领域是平等的 . 您的哈希函数应该与该定义匹配 . 散列三个字段中的每一个,并组合这些值,例如使用此处概述的方法:https://stackoverflow.com/a/263416/505088

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

相关问题