use md5::{Digest, Md5}; use uuid::Uuid; /// Offline player namespace. const OFFLINE_PLAYER_NAMESPACE: &str = "OfflinePlayer:"; /// Get UUID for given player username. fn player_uuid(username: &str) -> Uuid { java_name_uuid_from_bytes(username.as_bytes()) } /// Get UUID for given offline player username. pub fn offline_player_uuid(username: &str) -> Uuid { player_uuid(&format!("{}{}", OFFLINE_PLAYER_NAMESPACE, username)) } /// Java's `UUID.nameUUIDFromBytes` /// /// Static factory to retrieve a type 3 (name based) `Uuid` based on the specified byte array. /// /// Ported from: https://git.io/J1b6A fn java_name_uuid_from_bytes(data: &[u8]) -> Uuid { let mut hasher = Md5::new(); hasher.update(data); 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) }