public static int hashPath(@Nonnull PathNode<?> path) {
		// We only want to hash portions of a path that we support.
		//  - Classes
		//  - Members (Fields/methods)
		int baseHash;
		if (path instanceof ClassPathNode classPath) {
			baseHash = classPath.getValue().getName().hashCode();
		} else if (path instanceof ClassMemberPathNode memberPath) {
			ClassMember member = memberPath.getValue();
			int hash = 31 * member.getName().hashCode() + member.getDescriptor().hashCode();
			PathNode<?> parent = path.getParent();
			if (parent != null)
				hash = 31 * hashPath(parent) + hash;
			baseHash = hash;
		} else {
			// Unsupported path content.
			return -1;
		}

		// Because class and member names are known to the authors of the code, they could predict the hashes.
		// Thus, we salt the hash with information from the local system, which cannot realistically be predicted.
		// This is a bit overkill since all that they could do is insert the same annotation we'd normally create,
		// but because the actual comment data is stored externally they can't insert unintended comments.
		return SALT + 31 * baseHash;
	}
@param path
		Path input.

@return Hash of path.
recaf-core/src/main/java/software/coley/recaf/services/comment/CommentKey.java