/// <summary> /// Given a string, it hashes said string and if <paramref name="addIdentifiableCharacters"/> is true appends identifiable characters to make the root of the cache more human readable /// </summary> /// <param name="value"></param> /// <param name="addIdentifiableCharacters">whether to addIdentifiableCharacters. The default is true</param> /// <returns>hash</returns> public static string ComputeHash(string value, bool addIdentifiableCharacters = true) { var trailing = value.Length > 32 ? value.Substring(value.Length - 32) : value; byte[] hash; using (var sha = SHA256.Create()) { hash = sha.ComputeHash(Encoding.UTF8.GetBytes(value)); } return(EncodingUtility.ToHex(hash, HashLength) + (addIdentifiableCharacters ? "$" + trailing : string.Empty)); }
private static string FilePathToLockName(string filePath) { // If we use a file path directly as the name of a semaphore, // the ctor of semaphore looks for the file and throws an IOException // when the file doesn't exist. So we need a conversion from a file path // to a unique lock name. using (var sha = SHA256.Create()) { // To avoid conflicts on package id casing a case-insensitive lock is used. var fullPath = Path.IsPathRooted(filePath) ? Path.GetFullPath(filePath) : filePath; var normalizedPath = fullPath.ToUpperInvariant(); var hash = sha.ComputeHash(Encoding.UTF32.GetBytes(normalizedPath)); return(EncodingUtility.ToHex(hash, HashLength)); } }