pub fn xml_escape(value: &str) -> String {
let mut out = String::with_capacity(value.len());
for ch in value.chars() {
match ch {
'&' => out.push_str("&"),
'"' => out.push_str("""),
'<' => out.push_str("<"),
'>' => out.push_str(">"),
'\'' => out.push_str("'"),
_ => out.push(ch),
}
}
out
}
pub fn deterministic_guid(name: &str) -> String {
let mut h1: u64 = 5381;
let mut h2: u64 = 0xcbf29ce484222325;
for &b in name.as_bytes() {
h1 = h1.wrapping_shl(5).wrapping_add(h1).wrapping_add(b as u64);
h2 = (h2 ^ b as u64).wrapping_mul(0x100000001b3);
}
let p1 = (h1 >> 32) & 0xFFFF_FFFF;
let p2 = (h1 >> 16) & 0xFFFF;
let p3 = h1 & 0xFFFF;
let p4 = (h2 >> 48) & 0xFFFF;
let p5 = (h2 >> 32) & 0xFFFF;
let p6 = h2 & 0xFFFF_FFFF;
format!(
"{{{:08X}-{:04X}-{:04X}-{:04X}-{:04X}{:08X}}}",
p1, p2, p3, p4, p5, p6
)
}