Tengo un caso de uso particular en el que quiero hacer hash de varias matrices de float e int juntas. Estoy escribiendo una simulación en la que quiero memorizar una llamada de función. La función toma un tipo de Settings como entrada.
Los valores en las matrices Capacities y MaxRates son flotantes de 64 bits restringidos a un rango de 0.0 a 1,000,000.0. La longitud de Capacities y MaxRates también está restringida de 0 a 100. ValveState es un int con valores de 0 a 10.
Soy consciente de que el hash de flotadores arbitrarios es una mala idea. En este caso de uso particular, aunque los valores en Settings serán exactos, bit a bit coincide con la combinación anterior de valores. Esa es la razón por la que quiero memorizar una llamada de función usando Dictionary<Settings, 'Result> .
La llamada de función que quiero memorizar es costosa y ocupa> 90% del tiempo de ejecución. La combinación de valores en Settings se repite con frecuencia y son coincidencias exactas. En realidad, no se realizan operaciones matemáticas con los valores durante la simulación, por lo que no se produce un error de redondeo. Las primeras pruebas sugieren que memorizar esta función puede conducir a una mejora de 10 veces en la velocidad sin pérdida de precisión.
Estoy trabajando en F# pero cualquier cosa en .NET es aceptable ya que puedo traducirlo. Este es un ejemplo de cómo se ve el registro F#.
type Settings = { Capacities : array<float> MaxRates : array<float> ValveState : array<int> } with override this.GetHashCode () = // Your awesome suggestion herePuede usar HashCode.Combine (disponible en netstandard 2.1) para combinar hashes de todos los valores en las tres matrices.
open System let hashArray (arr : 'T array) = let mutable hash = 0 for x in arr do hash <- HashCode.Combine(hash, x) hash [<CustomEquality; NoComparison>] type Settings = { Capacities : array<float> MaxRates : array<float> ValveState : array<int> } with override this.GetHashCode () = HashCode.Combine( hashArray this.Capacities, hashArray this.MaxRates, hashArray this.ValveState ) override this.Equals(o : obj) = match o with | :? Settings as s -> this.Capacities = s.Capacities && this.MaxRates = s.MaxRates && this.ValveState = s.ValveState | _ -> false