private string ComputeHash() { try { // Create SHA256 hash calculator using var hashCalculator = SHA256.Create(); // Create a buffer to hold the file data being hashed byte[] buffer = new byte[2 * HashWindowLength]; // Open file using FileStream fileStream = MediaFileInfo.Open(FileMode.Open); // Small files read entire file, big files read front and back if (MediaFileInfo.Length <= buffer.Length) { // Read the entire file fileStream.Seek(0, SeekOrigin.Begin); if (fileStream.Read(buffer, 0, (int)MediaFileInfo.Length) != MediaFileInfo.Length) { Log.Logger.Error("Error reading from media file : {FileName}", MediaFileInfo.Name); return(null); } } else { // Read the beginning of the file fileStream.Seek(0, SeekOrigin.Begin); if (fileStream.Read(buffer, 0, HashWindowLength) != HashWindowLength) { Log.Logger.Error("Error reading from media file : {FileName}", MediaFileInfo.Name); return(null); } // Read the end of the file fileStream.Seek(-HashWindowLength, SeekOrigin.End); if (fileStream.Read(buffer, HashWindowLength, HashWindowLength) != HashWindowLength) { Log.Logger.Error("Error reading from media file : {FileName}", MediaFileInfo.Name); return(null); } } // Close stream fileStream.Close(); // Calculate the hash byte[] hash = hashCalculator.ComputeHash(buffer); // Convert to string return(System.Convert.ToBase64String(hash)); } catch (Exception e) when(Log.Logger.LogAndHandle(e, MethodBase.GetCurrentMethod()?.Name)) { return(null); } }