2015-10-19 15 views
5
int x = 10; int y = (x.hashcode() & 0xfffffff); 

Come sopra codice fa y è sempre positivo? Grazie!Come fare un hashcode (valore intero) positivo

+3

Se è pensato per essere un codice hash, perché vuoi assicurarti che sia positivo? Per quanto riguarda il motivo per cui lo sta già facendo - stai mantenendo i 32 bit in basso; i primi 4 bit saranno sempre cancellati. Qualunque 'int' con il bit più chiaro è non negativo. È possibile ottenere ciò senza perdere molte informazioni usando 'x.hashCode() & 0x7fffffff' (noto anche come' x.hashCode() e Integer.MAX_VALUE') –

+0

@JonSkeet Penso che stia chiedendo perché l'operazione bitwise ti farà ottenere valore positivo. –

+0

@SleimanJneidi: Beh, questo è quello che dice il corpo della domanda (e lo spiego nel commento) ma il * titolo * della domanda chiede come ottenere un valore positivo. –

risposta

9

x.hashcode() & 0xfffffff disattiva il segnale. Math.abs non viene utilizzato qui perché restituisce un valore negativo se x.hashCode è uguale a Integer.MIN_VALUE che renderà l'array hashtable's un ArrayOutOfBoundException che non è divertente.

Da @JonSkeet commento: Non si limita a disattivare il bit di segno, cancella anche i successivi tre bit.

Ma con i codici hash ci occupiamo sempre di collisioni, quindi è considerato buono.

+7

Non * solo * disattiva il bit di segno, attenzione - cancella anche i successivi tre bit ... –

+0

@JonSkeet molto vero. –

+0

Sleiman, potresti spiegare un po 'di più sul funzionamento interno dell'istruzione 'x.hashcode() & 0xfffffff'? Cosa sta succedendo esattamente sotto il cofano? – Sahand

Problemi correlati