Ich portiere ein C # -Skript in Spark (Scala) und ich stoße auf ein Problem mit der UUID-Generierung in Scala vs GUID-Generierung in C #.
Gibt es eine Möglichkeit, eine UUID in Java zu generieren, die identisch mit der in C # generierten UUID ist?
Ich erstelle den Primärschlüssel für eine Datenbank, indem ich eine GUID aus dem MD5-Hash einer Zeichenkette erstelle. Letztendlich möchte ich UUIDs in Java / Scala generieren, die mit denen aus dem C # -Skript übereinstimmen, sodass die vorhandenen Daten in der Datenbank, die die C # -Implementierung für Hashing verwendet haben, nicht erneut aufgeräumt werden müssen.
C # zum Port:
%Vor%Scala portierter Code:
%Vor%Ergebnis von C #
Ergebnis von Scala
Was funktioniert:
Was nicht:
Haben Sie keine andere Möglichkeit, die Bytes zu manipulieren?
Wenn Sie möchten, dass Ihr C # und Ihr Java genau so funktionieren (und Sie mit dem vorhandenen C # -Verhalten zufrieden sind), müssen Sie einige Bytes in uuid_bytes
manuell neu ordnen (dh einige austauschen) der Einträge, die Sie als außer Betrieb identifiziert haben).
Zusätzlich sollten Sie nicht verwenden:
%Vor%Aber verwenden Sie stattdessen:
%Vor%Schamlos aus Ссылка gestohlen:)
Falls Sie es nicht wussten, wenn Sie mit C # umgehen: GUIDs :
Beachten Sie, dass die Reihenfolge der Bytes im zurückgegebenen Byte-Array unterschiedlich ist aus der Zeichenfolgendarstellung eines Guid-Werts. Die Reihenfolge der Anfang Vier-Byte-Gruppe und die nächsten zwei Zwei-Byte-Gruppen ist umgekehrt, während die Reihenfolge der letzten Zwei-Byte-Gruppe und das Schließen Sechs-Byte-Gruppe ist gleich. Das Beispiel bietet eine Illustration.
Und :
Die Reihenfolge der Hexadezimalzeichenfolgen, die von der ToString-Methode zurückgegeben werden hängt davon ab, ob die Computerarchitektur Little-Endian oder ist Big-Endian.
In Ihrem C #, anstatt zu verwenden:
%Vor%sollten Sie Folgendes in Betracht ziehen:
%Vor% Ihr bestehender Code ruft ToString
hinter den Kulissen auf. Ach, ToString
und ToByteArray
geben die Bytes in der gleichen Reihenfolge nicht zurück .