【发布时间】:2012-07-02 13:27:28
【问题描述】:
考虑以下记录:
TMyRecord = record
b: Boolean;
// 3 bytes of padding in here with default record alignment settings
i: Integer;
end;
我希望实现IEqualityComparer<TMyRecord>。为此,我想致电TEqualityComparer<TMyRecord>.Construct。这需要提供TEqualityComparison<TMyRecord>,这对我没有任何问题。
但是,Construct 也需要THasher<TMyRecord>,我想知道实现它的规范方法。该函数需要具有以下形式:
function MyRecordHasher(const Value: TMyRecord): Integer;
begin
Result := ???
end;
我希望我需要在记录值的两个字段上调用BobJenkinsHash,然后以某种方式将它们组合起来。这是正确的方法吗?我应该如何将它们结合起来?
我不使用TEqualityComparison<TMyRecord>.Default 的原因是它使用了CompareMem,因此由于记录的填充而将不正确。
【问题讨论】:
-
在您的情况下,是否真的需要哈希值?否则,我假设返回的值无论如何都不会被使用,所以它可以是任何东西,甚至是像 1 这样的文字值。还是我错了?
-
@Rudy 不需要哈希值。我可以返回一个真实的常量。或者引发
EMethodNotImplemented异常。但我很好奇如何正确地做到这一点。 -
啊,那好吧。不过,好奇心似乎对猫不利。 ;-)
标签: delphi hash delphi-xe2