Sto provando a ricavare un file Graphviz che descrive un valore strutturato. Questo è per scopi diagnostici, quindi voglio che il mio grafico rispecchi il più possibile la struttura reale nella memoria. Sto utilizzando il seguente per mappare i valori per i vertici graphviz modo che io possa riutilizzare un vertice quando un valore è dotato di due o più riferimenti in entrata:Alternativa basata sull'identità fisica a Hashtbl.hash
let same = (==)
module StateIdentity : Hashtbl.HashedType = struct
type t = R.meta_t state
let hash = Hashtbl.hash
let equal = same
end
module StateHashtbl = Hashtbl.Make (StateIdentity)
La documentazione per Hashtbl.hash
suggerisce che è adatto per l'uso sia quando StateIdentity.equal = (=)
e quando StateIdentity.equal = (==)
ma mi piacerebbe assicurarmi che l'accesso alla tabella hash sia il più vicino possibile a O (1), quindi preferisco non avere Hashtbl.hash
un grafico di oggetti (potenzialmente grandi in questo caso) su ogni ricerca.
So che Ocaml sposta i riferimenti in giro, ma esiste un proxy O (1) per l'identità di riferimento disponibile in Ocaml?
La risposta a Hashtable of mutable variable in Ocaml non suggerisce.
Sono dispiaciuto di allegare numeri seriali agli stati, poiché si tratta di codice diagnostico, quindi qualsiasi errore che faccio è potenzialmente in grado di mascherare altri bug.
"La documentazione per Hashtbl.hash suggerisce che è adatto per l'uso sia quando StateIdentity.equal = (=) e quando StateIdentity.equal = (==)" Non è però. 'Hashtbl.hash' ha molte collisioni quando associato all'eguaglianza fisica, il che significa che dovresti usarlo, il tuo hashtable potrebbe degenerare in una breve serie di lunghi elenchi di chiavi strutturalmente uguali, fisicamente differenti. –
@PascalCuoq, Giusto. Con "adatto" intendevo "mantiene sostituisce e trova invariante" e non si riferiva a mantenere costante il numero di confronti chiave sulla ricerca. –