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

Wie oben Code machen macht y immer positive ist? Vielen Dank!Wie man einen Hash-Code (Integer-Wert) positiv

+3

Wenn es ein Hash-Code sein soll, warum möchten Sie sicherstellen, dass es positiv ist? Warum es das schon tut - Sie behalten die unteren 32 Bits; Die oberen 4 Bits werden immer gelöscht. Ein beliebiges "int" mit dem obersten Bit clear ist nicht negativ. Sie könnten dies erreichen, ohne so viele Informationen zu verlieren, indem Sie 'x.hashCode() & 0x7fffffff' (aka' x.hashCode() & Integer.MAX_VALUE') verwenden. –

+0

@JonSkeet Ich denke, er fragt, warum die bitweise Operation Ihnen einen bringt positiver Wert. –

+0

@SleimanJneidi: Nun, das ist, was der Körper der Frage sagt (und ich erkläre es im Kommentar), aber der * Titel * der Frage fragt, wie man einen positiven Wert bekommt. –

Antwort

9

x.hashcode() & 0xfffffff wird das Vorzeichenbit ausschalten. Math.abs wird hier nicht verwendet, weil es negativ zurückgibt, wenn x.hashCode gleich Integer.MIN_VALUE ist, die das hashtable's Array eine ArrayOutOfBoundException werfen wird, die nicht lustig ist.

Von @JonSkeet Kommentar: Es schaltet nicht nur das Vorzeichen Bit aus, es löscht auch die nächsten drei Bits.

Aber mit Hash-Codes beschäftigen wir uns ständig mit Kollisionen, daher wird es als gut angesehen.

+7

Es * nicht * nur * das Zeichen Bit abstellen, wohlgemerkt - es löscht auch die nächsten drei Bits ... –

+0

@JonSkeet sehr wahr. –

+0

Sleiman, könnten Sie etwas mehr über die innere Funktionsweise dieses 'x.hashcode() & 0xfffffff' Statements erklären? Was passiert genau unter der Haube? – Sahand