首頁 >後端開發 >C++ >校驗和和區塊比較可以加速 .NET 中的檔案比較嗎?

校驗和和區塊比較可以加速 .NET 中的檔案比較嗎?

Barbara Streisand
Barbara Streisand原創
2025-01-10 16:33:44218瀏覽

Can Checksumming and Chunk Comparison Speed Up File Comparison in .NET?

.NET高效文件比較技術

逐字節比較文件是一種常見方法,但效率低。本文探討更快速的檔案比較方法,並介紹.NET中用來產生校驗和的函式庫。

校驗比較能否提升速度?

是的,使用CRC等演算法進行校驗和比較比逐位元組方法更快。校驗和為每個文件產生唯一的簽名,從而可以比較簽名而不是整個文件。

.NET檔案校驗與產生庫

多個.NET函式庫提供檔案校驗和產生功能:

  • System.Security.Cryptography.MD5:產生檔案的MD5校驗和。
  • System.Security.Cryptography.SHA1:計算檔案的SHA1校驗和。
  • System.Security.Cryptography.SHA256:計算檔案的SHA256校驗和。
  • System.Security.Cryptography.SHA512:產生檔案的SHA512校驗和。

最佳化的比較方法

雖然雜湊是一種快速方法,但您可以使用一種讀取大塊位元組並將其作為數字進行比較的方法來進一步優化檔案比較:

<code class="language-csharp">const int BYTES_TO_READ = sizeof(Int64);

static bool FilesAreEqual(FileInfo first, FileInfo second)
{
    if (first.Length != second.Length)
        return false;

    if (string.Equals(first.FullName, second.FullName, StringComparison.OrdinalIgnoreCase))
        return true;

    int iterations = (int)Math.Ceiling((double)first.Length / BYTES_TO_READ);

    using (FileStream fs1 = first.OpenRead())
    using (FileStream fs2 = second.OpenRead())
    {
        byte[] one = new byte[BYTES_TO_READ];
        byte[] two = new byte[BYTES_TO_READ];

        for (int i = 0; i < iterations; i++)
        {
            int read1 = fs1.Read(one, 0, BYTES_TO_READ);
            int read2 = fs2.Read(two, 0, BYTES_TO_READ);

            if (read1 != read2 || !one.SequenceEqual(two))
                return false;
        }
    }

    return true;
}</code>

效能測試結果

效能測試表明,對於大型檔案(例如100MB的視訊檔案),將檔案區塊作為數字進行比較的效能優於逐位元組比較和雜湊:

  • 區塊比較:1063ms
  • 逐字節比較:3031ms
  • 哈希:865ms

對於較小的文件,由於其最佳化的特性,雜湊通常更快。但是,對於大型文件,讀取和處理整個文件的開銷可能很大,此時區塊比較方法更快。

以上是校驗和和區塊比較可以加速 .NET 中的檔案比較嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn