Gibt es eine Möglichkeit, eine UUID in Java zu generieren, die identisch mit der in C # generierten UUID ist?

8

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 #

  • String zum Hash: Hallo Welt
  • MD5: B1-0A-8D-B1-64-E0-75-41-05-B7-A9-9B-E7-2E-3F-E5
  • Guid: b18d0ab1-e064-41 75 - 05 b7-a99be72e3fe5

Ergebnis von Scala

  • String zum Hash: Hallo Welt
  • MD5: b10a8db164e0754105b7a99be72e3fe5
  • UUID: b10a8db1-64e0- 35 41- 85 b7-a99be72e3fe5

Was funktioniert:

  • MD5-Hashes (auf denen GUID und UUID basieren) stimmen mit
  • überein

Was nicht:

  • Die ersten drei Felder haben Endianness in C # (orange) geschaltet
    • Die GUID von C # wählt die native Byte-Reihenfolge für die ersten drei Felder (4, 2, 2), in diesem Fall Little Endian und Big Endian für das letzte Feld (8), während die UUID von Java die Big-Endian-Reihenfolge für alle vier verwendet Felder; Dies erklärt die Byte-Reihenfolge in den ersten drei Feldern in C #.
  • Viertes und fünftes Byte sind verschieden (rot)
    • Java schaltet 6-7 Bits um, um Version und Variante von UUID zu bezeichnen, dies könnte die Unterschiede in den Bytes 4 und 5 erklären. Dies scheint der Roadblock zu sein.
  • Ich verstehe, dass Java signierte Bytes verwendet, während C # vorzeichenlose Bytes hat; Dies könnte auch relevant sein.

Haben Sie keine andere Möglichkeit, die Bytes zu manipulieren?

    
Ari Krumbein 26.07.2017, 21:20
quelle

1 Antwort

5

TL; DR

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:)

Zusätzlicher Hintergrund

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 .

    
mjwills 26.07.2017, 21:51
quelle

Tags und Links