gpt4 book ai didi

delphi - GetHashCode 好的做法吗?

转载 作者:行者123 更新时间:2023-12-03 15:00:52 29 4
gpt4 key购买 nike

对于 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() 函数的最佳实践是什么?

问候

最佳答案

问题中的代码对对象的地址而不是其值进行哈希处理,因此与您对相等性的定义不一致。

您对相等的定义是三个字段相等。您的哈希函数应该与该定义匹配。对三个字段中的每一个字段进行哈希处理,然后组合这些值,例如使用此处概述的方法:https://stackoverflow.com/a/263416/505088

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

关于delphi - GetHashCode 好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41076070/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com