Considérese el siguiente registro:¿Cuál es la forma canónica de escribir una función hasher para TEqualityComparer.Construct?
TMyRecord = record
b: Boolean;
// 3 bytes of padding in here with default record alignment settings
i: Integer;
end;
deseo de implementar IEqualityComparer<TMyRecord>
. Para hacerlo, quiero llamar al TEqualityComparer<TMyRecord>.Construct
. Esto necesita ser provisto con un TEqualityComparison<TMyRecord>
que no me presenta ningún problema.
Sin embargo, Construct
también requiere un THasher<TMyRecord>
y me gustaría conocer el método canónico para implementarlo. La función debe tener la siguiente forma:
function MyRecordHasher(const Value: TMyRecord): Integer;
begin
Result := ???
end;
espero que necesito llamar BobJenkinsHash
en ambos campos del valor de registro y luego combinar de alguna forma. ¿Es este el enfoque correcto, y cómo debería combinarlos?
La razón por la que no uso TEqualityComparison<TMyRecord>.Default
es que usa CompareMem
y, por lo tanto, será incorrecta debido al relleno del registro.
es el valor de hash realmente se necesita, en su situación ? De lo contrario, supongo que el valor devuelto no se usa de todos modos, por lo que puede ser cualquier cosa, incluso un valor literal como 1. ¿O estoy equivocado aquí? –
@Rudy El valor hash no es necesario. Y podría devolver una constante que es verdad. O crea una excepción 'EMethodNotImplemented'. Pero tenía curiosidad de cómo hacerlo bien. –
ah, bien entonces. Sin embargo, la curiosidad parece hacer algo malo a los gatos. ;-) –