对于一个Delphi项目(由RAD XE7构建),我想创建一个笔刷字典。每个字典项都包含一个TMyBrush对象作为键,该对象描述要检索的画笔,以及一个GDI+画笔作为值。
TMyBrush类包含3个字段
在我的字典里,我想根据他的特点,而不是根据他的情况检索一支刷子。例如,我希望从字典中获得一个黑色实心刷,方法是创建一个本地TMyBrush实例,将其配置为黑色实心,并使用TryGetValue()函数获得匹配的GDI+值。为此,我创建了一个TMyBrushComparer。
编写Equals()函数对我来说不是个问题。但是,我不知道编写GetHashCode()函数的最佳实践是什么。我倾向于写这样的函数:
function TMyBrushComparer.GetHashCode(const pValue: TMyBrush): Integer;
begin
Result := BobJenkinsHash(pValue, SizeOf(TMyBrush), 0);
end;但是我觉得那不是一个很好的做法,对吗?那么,为我的GetHashCode编写一个好的TMyBrushComparer ()函数的最佳实践是什么?
问候
发布于 2016-12-10 15:19:16
问题中的代码散列对象的地址,而不是它的值,因此不符合平等的定义。
你对平等的定义是三个字段是相等的。您的散列函数应该与该定义相匹配。散列这三个字段中的每一个,并组合这些值,例如使用以下方法:https://stackoverflow.com/a/263416/505088
您的两个字段是值类型。它们很容易散列以匹配值标识。刷子信息字段似乎是引用类型。因此,您需要再次确定您想要的标识形式(引用标识、值标识或其他身份),然后实现匹配的等式测试和哈希。
https://stackoverflow.com/questions/41076070
复制相似问题