Una soluzione accartocciata:
Probabilmente potresti unire insieme qualcosa in cui ogni livello del grafico ha influenzato una porzione diversa del valore hash. In pratica, ciò che dovresti fare è creare un valore hash separato per ogni livello e aggiungerli in sequenza.
es. Per un hash a 32 bit e grafici con 8 livelli, ogni livello potrebbe essere hash a 4 bit: 1 ° livello = > bit 1-4; 2 ° livello = > bit 5-8; ecc.
Se il numero di livelli nei tuoi grafici non è corretto / noto, dovrai avvolgerlo. Questo non ti direbbe esattamente quale livello era diverso, ma ridurrebbe le tue opzioni.
es. Per un hash a 32 bit e grafici con un numero sconosciuto di livelli, ogni livello poteva ancora hash a 4 bit: i bit 1-4 sarebbero influenzati dai livelli 1, 9, 17, ...; i bit 5-8 sarebbero influenzati dai livelli 2, 10, 18, ...; e così via.
Perché è probabilmente una cattiva idea:
- La funzione di hash che ho descritto è una funzione di hashing della spazzatura . Prevedo che produrrebbe molti scontri e una scarsa distribuzione.
- Utilizzare i valori hash per rilevare le differenze è più rapido se c'è una differenza.
hash(A) != hash(B)
ti dice che A e B sono diversi, ma hash(A) == hash(B)
fa non ti dice che sono gli stessi. Nel secondo caso, dovrai fare un confronto completo per essere sicuro.
Alcuni altri approcci possibili:
- Prendi un altro approccio. Se i confronti sono troppo lenti, esegui un profiler e vedi se ci sono altri modi per velocizzare il confronto: prova a utilizzare una struttura dati diversa per archiviare i tuoi grafici, ecc.
- Prova un compromesso:
- Crea un valore hash separato per ogni livello e uno per l'intero grafico. Confrontare i valori hash per ogni livello sarà ancora più veloce rispetto al confronto di ogni singolo nodo.
- Invece di usare un valore hash per accelerare i tuoi confronti, crea due oggetti con metadati sui grafici (ad esempio # di livelli, # di nodi su ogni livello, ecc.) e confrontali.