سؤال

هل هناك أي خوارزمية سريعة تسمح بمقارنة ملفين (لغرض التحقق) دون الحاجة إلى قراءة المحتويات بأكملها؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام Hash MD5 على كلا الملفين ومقارنتها بهذه الطريقة. ومع ذلك فإنه يقرأ تقنيا بالملف بأكمله. لن تكون قادرا على اليقين بنسبة 100٪ دون التحقق، لا أعتقد ذلك.

في C # One سيقوم بذلك بالطريقة التالية (آسف، لم تذكر لغة محددة):

protected string GetMD5HashFromFile(string fileName)
{
    byte[] retVal = { };

    using (FileStream file = new FileStream(fileName, FileMode.Open))
    using (MD5 md5 = new MD5CryptoServiceProvider())
    {
        retVal = md5.ComputeHash(file);
    }

    if (retVal.Length > 0)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < retVal.Length; i++)
        {
            sb.Append(retVal[i].ToString("x2"));
        }

        return sb.ToString();
    }
    else
    {
        return string.Empty;
    }
}

bool CompareFiles(string fileName1, string fileName2)
{
    return (GetMD5HashFromFile(fileName1) == GetMD5HashFromFile(fileName2));
}

نصائح أخرى

يمكنك كتابة إجراء CRC مخصص يقرأ بت الملف. على سبيل المثال 16 بايت لكل 1K أو شيء من هذا القبيل بدلا من اخبار الملف بأكمله. من المخادف، بالطبع، نظرا لأن البيانات قد تتغير حيث لا تبحث وليس لها تأثير على كتلك المقارنة. لكن اتفاقية حقوق الطفل محفوفة بالمخاطر بعض الشيء لأن اثنين من مجموعات بيانات مختلفة جدا يمكن أن تعيد نفس القيمة.

لا توجد خوارزمية لتكون 25٪ متأكدا من الملفات هي نفسها إلا إذا قرأت كل بايت. والدليل بسيط - افترض أن هذه الخوارزمية موجودة، ونحن نستخدمها لمقارنة ملفين. التي تنطوي على بعض عدد البايتات لا تقرأ من قبل الخوارزمية. يمكنني أن يسبب الخوارزمية تفشل عن طريق تغيير تلك البايتات في ملف واحد ولكن ليس الآخر.

من المستحيل رياضيا تحديد أن ملفين من نفس الحجم متساوون دون قراءة كل منهما كلاهما تماما، ولكن من الممكن للغاية تحديد أنهم ليس متساوي دون قراءة كلاهما تماما. يمكن القيام بذلك بطرق مختلفة، مثل استخدام وظائف التجزئة أو مقارنة ماس كهربائى.

أخشى أن لا يمكنك تجنب قراءة كلا الملفين بالكامل لتكون متأكدة تماما.

يمكنك أولا التحقق من حجم الملف؛ إذا كانت مختلفة، فإن الملفات مختلفة (ولكن ماذا عن الملفات النصية التي تختلف فقط على فاصل الخط؟).

إذا كان الحجم هو نفسه، لا أرى أي طريقة صحيحة للذهاب إلى أبعد من ذلك ولكن البدء في قراءة الملفين. بالطبع يمكن أن تتوقف بمجرد أن يختلف المخزن المؤقت، ولكن يمكن أن يذكر أن الملفات فقط هل حقا يساوي عندما يتم معالجة الشخصية الأخيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top