in sgx_tstd/src/path.rs [2804:2850]
fn hash<H: Hasher>(&self, h: &mut H) {
let bytes = self.as_u8_slice();
let (prefix_len, verbatim) = match parse_prefix(&self.inner) {
Some(prefix) => {
prefix.hash(h);
(prefix.len(), prefix.is_verbatim())
}
None => (0, false),
};
let bytes = &bytes[prefix_len..];
let mut component_start = 0;
let mut bytes_hashed = 0;
for i in 0..bytes.len() {
let is_sep = if verbatim { is_verbatim_sep(bytes[i]) } else { is_sep_byte(bytes[i]) };
if is_sep {
if i > component_start {
let to_hash = &bytes[component_start..i];
h.write(to_hash);
bytes_hashed += to_hash.len();
}
// skip over separator and optionally a following CurDir item
// since components() would normalize these away.
component_start = i + 1;
let tail = &bytes[component_start..];
if !verbatim {
component_start += match tail {
[b'.'] => 1,
[b'.', sep @ _, ..] if is_sep_byte(*sep) => 1,
_ => 0,
};
}
}
}
if component_start < bytes.len() {
let to_hash = &bytes[component_start..];
h.write(to_hash);
bytes_hashed += to_hash.len();
}
h.write_usize(bytes_hashed);
}