Derive correct UUID for offline players in lobby logic (2/2)
This commit is contained in:
@@ -6,7 +6,7 @@ const OFFLINE_PLAYER_NAMESPACE: &str = "OfflinePlayer:";
|
||||
|
||||
/// Get UUID for given player username.
|
||||
pub fn player_uuid(username: &str) -> Uuid {
|
||||
Uuid::from_bytes(jdk_name_uuid_from_bytes(username.as_bytes()))
|
||||
java_name_uuid_from_bytes(username.as_bytes())
|
||||
}
|
||||
|
||||
/// Get UUID for given offline player username.
|
||||
@@ -14,13 +14,20 @@ pub fn offline_player_uuid(username: &str) -> Uuid {
|
||||
player_uuid(&format!("{}{}", OFFLINE_PLAYER_NAMESPACE, username))
|
||||
}
|
||||
|
||||
/// Java's `UUID.nameUUIDFromBytes`.
|
||||
/// Java's `UUID.nameUUIDFromBytes`
|
||||
///
|
||||
/// Static factory to retrieve a type 3 (name based) `Uuid` based on the specified byte array.
|
||||
///
|
||||
/// Ported from: https://github.com/AdoptOpenJDK/openjdk-jdk8u/blob/9a91972c76ddda5c1ce28b50ca38cbd8a30b7a72/jdk/src/share/classes/java/util/UUID.java#L153-L175
|
||||
fn jdk_name_uuid_from_bytes(data: &[u8]) -> [u8; 16] {
|
||||
/// Ported from: https://git.io/J1b6A
|
||||
fn java_name_uuid_from_bytes(data: &[u8]) -> Uuid {
|
||||
let mut hasher = Md5::new();
|
||||
hasher.update(data);
|
||||
hasher.finalize().into()
|
||||
let mut md5: [u8; 16] = hasher.finalize().into();
|
||||
|
||||
md5[6] &= 0x0f; // clear version
|
||||
md5[6] |= 0x30; // set to version 3
|
||||
md5[8] &= 0x3f; // clear variant
|
||||
md5[8] |= 0x80; // set to IETF variant
|
||||
|
||||
Uuid::from_bytes(md5)
|
||||
}
|
||||
|
Reference in New Issue
Block a user