Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

224
Views
Función hash para arreglos de flotantes e enteros en .NET

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 here
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Puede 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
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!