Come sempre in sicurezza, quale minaccia stai cercando di proteggere?
Sembra che dalla domanda tu sia preoccupato per la disponibilità. In genere una tabella hash avrà prestazioni limitanti di O (1) per operazioni semplici, ma peggiorerà nel caso peggiore di O (n). (Vedi Linee guida per la codifica sicura per Java SE .) Say, sarà un server web utilizzare le risorse in modo sproporzionato rispetto alle dimensioni di una richiesta nel caso peggiore pericolosa. L'articolo collegato alla questio riguarda Serializzazione Java, che è una cosa diversa dal buco (e in realtà non protegge la disponibilità).
Tutto dipende dall'implementazione.
Da circa un decennio circa, l'implementazione di HashMap
di Sun ha generalmente utilizzato solo un modulo di ciò che è uscito da Object.hashCode
. Vedi ad esempio la definizione di String.hashCode
. Per String
è banale generare un testo diverso con lo stesso hash. Dai un vecchio HashMap
a un gruppo di chiavi con lo stesso hash, utilizzeranno solo un bucket e le prestazioni saranno terribili.
In seguito l'implementazione del Sun ha mescolato il valore hash in giro prima di prendere il modulo. Tuttavia, se l'hash era lo stesso per iniziare, sarà sempre lo stesso.
TreeMap
risolve i problemi, ma le prestazioni benigne del caso non sono le migliori, sebbene siano migliorate.
Più di recente, per placare coloro che non sanno come funzionano le tabelle hash, OpenJDK ha usato varianti di MurmurHash, con un seme casuale per istanza, per String
quando ci sono molte collisioni. Questo sostituisce String.hashCode
- semplicemente aggiungendo lo stesso numero a un hash fisso non altera le collisioni. Sebbene tecnicamente "non crittografico", è presumibilmente difficile generare collisioni senza conoscere il seme segreto. Ci sono sempre canali secondari.
Ora sostituendo MurmurHash, è l'algoritmo ovvio di usare un albero al posto di un elenco lineare per i bucket quando ci sono state molte collisioni. Siccome HashMap
non è mai stato progettato per questo, si tratta di un trucco oltraggioso, ma un trucco in cui la libreria arriva con l'odore delle rose anche se abusato (soprattutto). L'algoritmo alternativo viene utilizzato solo in caso di numerose collisioni (come con Murmur) e solo per le istanze in cui ogni chiave sembra implementare Comparable
type-compatible.