in lib/src/context.dart [897:948]
int? _hashFast(String path) {
var hash = 4603;
var beginning = true;
var wasSeparator = true;
for (var i = 0; i < path.length; i++) {
final codeUnit = style.canonicalizeCodeUnit(path.codeUnitAt(i));
// Take advantage of the fact that collisions are allowed to ignore
// separators entirely. This lets us avoid worrying about cases like
// multiple trailing slashes.
if (style.isSeparator(codeUnit)) {
wasSeparator = true;
continue;
}
if (codeUnit == chars.period && wasSeparator) {
// If a dot comes after a separator, it may be a directory traversal
// operator. To check that, we need to know if it's followed by either
// "/" or "./". Otherwise, it's just a normal character.
//
// hash("foo/./bar") == hash("foo/bar")
// We've hit "/." at the end of the path, which we can ignore.
if (i + 1 == path.length) break;
final next = path.codeUnitAt(i + 1);
// We can just ignore "/./", since they don't affect the semantics of
// the path.
if (style.isSeparator(next)) continue;
// If the path ends with "/.." or contains "/../", we need to
// canonicalize it before we can hash it. We make an exception for ".."s
// at the beginning of the path, since those may appear even in a
// canonicalized path.
if (!beginning &&
next == chars.period &&
(i + 2 == path.length ||
style.isSeparator(path.codeUnitAt(i + 2)))) {
return null;
}
}
// Make sure [hash] stays under 32 bits even after multiplication.
hash &= 0x3FFFFFF;
hash *= 33;
hash ^= codeUnit;
wasSeparator = false;
beginning = false;
}
return hash;
}