Exemple #1
0
    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);
        }
    }