von C zu Java

Hallo, ich würde gerne folgendes Programm von C zu Java ändern. Jedoch bin ich mir wirklich nicht sicher, ob das so richtig ist:
C:
Code:
uint32_t hash(const char *arKey, uint32_t nKeyLength) {
	uint32_t hash = 5381;
	for (; nKeyLength > 0; nKeyLength -=1) {
		hash = ((hash << 7) + hash) ^ *arKey++;
	}
	return hash;
}

Java:
Code:
public static int HashIt(char[] arKey, int KeyLength) {
			int hash = 5381;
			int i = 0;
			for (;KeyLength > 0; KeyLength -=1) {
				hash = (694149)^arKey[i++];
			}
			return hash;
		}

Anmerkung:
den binary-Wert von hash um 7 Stellen nach links zu schieben ist das gleiche wie mit 2^7 zu multiplizieren. Addiert man anschließend noch einmal hash, multipliziert man mit 2^7+1, was 129 entspricht. 5381*129=694149

EDIT:
Die Logik war zwar richtig, jedoch zerstört dieses die Dynamik des Programms. Daher ist der richtige Java-Code:
Code:
public static int HashIt(char[] arKey, int KeyLength) {
			int hash = 5381;
			int i = 0;
			for (;KeyLength > 0; KeyLength -=1) {
				hash = ((hash << 7)+hash)^arKey[i++];
			}
			return hash;
		}
 
Zuletzt bearbeitet:
Wie du schon selber bemerkt hast, wird durch die Iteration der Wert hinter der Variable hash geändert und ist damit keineswegs konstant.

Des Weiteren musst du bei Bit-Shift-Operationen aufpassen. In C benutzt du einen unsigned int und Java ist alles signed. Die Shift-Operationen "<<" ist in Java "signed", d.h. das signed-Bit bleibt bestehen. Du musst hier den unsigned-Shift "<<<" nutzen.
 
Der unsigned shift funktioniert bei mir nicht. soweit ich weiß, ist es eben überhaupt nicht möglich, etwas in Java unsigned zu behandeln, ohne eine andere bibliothek zu verwenden.
Ich bin derweil von int auf long gewechselt.
 
Entschuldigung, du hast Recht. In Java gibt es tatsächlich nur drei Shift-Opertationen.
<<: Schiebt einfach das 31te Bit in das 32te Bit rein. Entspricht also einem unsigned Shift.
>>: Behält das 32te Bit. D.h. das Vorzeichen bleibt immer gleich.
>>>: Schiebt das 32te Bit in das 31te Bit rein und füllt links mit 0en. Vorzeichen kann sich also ändern und entspricht damit dem unsigned Shift.

Einen signed Linksshift gibt es demnach gar nicht.
 
Zuletzt bearbeitet:
Zurück
Oben