Se si guarda alla source code of java.lang.String of openjdk-1.6, ho visto che String.hashCode() utilizza 31 come numero primo e calcolaIs String.hashCode() è inefficiente?
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Ora, la ragione per me di guardare a questo è stata la domanda che avevo in mente se si confrontano i codici hash in String.equals renderebbe String.equals notevolmente più veloce. Ma guardando hashCode ora, le seguenti domande mi vengono in mente:
- Non sarebbe un più grande primo contribuire ad evitare collisioni meglio, almeno per brevi stringhe, visto che per esempio "BC" ha lo stesso hash come " Ab "(dal momento che le lettere ascii vivono nella regione 65-122, un primo più alto di quello funziona meglio)?
- È una decisione consapevole utilizzare 31 come primo, o solo uno casuale che viene utilizzato perché è comune?
- Quanto è probabile una collisione di hash, data una lunghezza di stringa fissa? dove questa domanda sta andando è la domanda iniziale su come il confronto tra hashCode e lunghezza String potrebbe già distinguere le stringhe, per evitare di confrontare i contenuti effettivi.
- un po 'fuori tema, forse: c'è una buona ragione per cui String.equals non confronta hashCode come scorciatoia aggiuntiva?
- un po 'più fuori tema: supponendo di avere due stringhe con lo stesso contenuto di, ma diverse istanze: esiste un modo per affermare l'uguaglianza senza effettivamente confrontare i contenuti? Immagino di no, dato che in qualche modo nelle lunghezze delle Stringhe, lo spazio esplode in dimensioni dove inevitabilmente avremo collisioni, ma per quanto riguarda alcune restrizioni - solo un certo set di caratteri, una lunghezza massima della corda ... e quanto dobbiamo limitare lo spazio stringa per essere in grado di avere una tale funzione hash?
Off-topic- Non è possibile utilizzare 'hashCode()' per controllare l'uguaglianza perché, praticamente 2 oggetti stringa non-eqaul ** possono avere ** stesso 'hashCode()' – sanbhat
@sanbhat OP significa se si utilizza 'hashCode 'può essere un primo modo per sapere se entrambi i' Stringhe 'devono davvero confrontare i suoi contenuti. –
@sanbhat Penso che sia abbastanza chiaro dalla domanda che l'OP è a conoscenza di questo. La parte della domanda che è rilevante chiede perché non usiamo 'hashcode' per la scorciatoia' equals', cioè se i codici hash sono diversi non possono essere uguali. – selig