delphi – 为TEqualityComparer.Construct编写hasher函数的规范
请考虑以下记录:
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,因此记录的填充会不正确. 解决方法
关于覆盖hashCode的
Effective Java (by Joshua Bloch)部分可能很有用.它显示了如何组合对象(或记录)的各个部分以有效地构造hashCode.
这可以转换成Delphi代码,如下所示: {$IFOPT Q+} {$DEFINE OverflowChecksEnabled} {$Q-} {$ENDIF} function CombinedHash(const Values: array of Integer): Integer; var Value: Integer; begin Result := 17; for Value in Values do begin Result := Result*37 + Value; end; end; {$IFDEF OverflowChecksEnabled} {$Q+} {$ENDIF} 然后,这允许实现MyRecordHasher: function MyRecordHasher(const Value: TMyRecord): Integer; begin Result := CombinedHash([IfThen(Value.b,1),Value.i]); end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |