Qual é a maneira canônica de escrever uma função hasher para TEqualityComparer.Construct?
Considere o seguinte registro:
TMyRecord = record
b: Boolean;
// 3 bytes of padding in here with default record alignment settings
i: Integer;
end;
Desejo implementarIEqualityComparer<TMyRecord>
. Para fazer isso eu quero ligarTEqualityComparer<TMyRecord>.Construct
. Isso precisa ser fornecido com umTEqualityComparison<TMyRecord>
que não apresenta problemas para mim.
Contudo,Construct
também requer umTHasher<TMyRecord>
e gostaria de conhecer o método canônico para implementá-lo. A função precisa ter o seguinte formato:
function MyRecordHasher(const Value: TMyRecord): Integer;
begin
Result := ???
end;
Eu espero que eu precise ligarBobJenkinsHash
em ambos os campos do valor de registro e, em seguida, combiná-los de alguma forma. Essa é a abordagem correta e como devo combiná-las?
A razão que eu não usoTEqualityComparison<TMyRecord>.Default
é que ele usaCompareMem
e assim será incorreto devido ao preenchimento do registro.