문제

전체 내용을 읽을 필요없이 두 파일 (확인 목적)을 비교할 수있는 빠른 알고리즘이 있습니까?

도움이 되었습니까?

해결책

두 파일 모두에서 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 절차를 작성할 수 있습니다. 예를 들어, 1k마다 16 바이트 또는 전체 파일을 크게하는 대신 그와 비슷한 것입니다. 물론 데이터가 찾고 있지 않은 곳에서 변경 될 수 있고 비교 블록에 영향을 미치지 않기 때문에 위험합니다. 그러나 CRC는 매우 위험합니다. 두 개의 매우 다른 데이터 세트가 동일한 값을 반환 할 수 있으므로 CRC도 약간 위험합니다.

모든 바이트를 읽지 않으면 파일이 동일하다고 확신 할 알고리즘이 100%가 아닙니다. 증거는 간단합니다. 이러한 알고리즘이 존재한다고 가정하고이를 사용하여 두 파일을 비교합니다. 이는 일부 수의 바이트가 알고리즘에 의해 읽히지 않음을 의미합니다. 한 파일에서 바이트를 변경하여 알고리즘이 실패 할 수 있습니다.

동일한 크기의 두 파일이 두 파일을 완전히 읽지 않고 동일하다고 판단하는 것은 수학적으로 불가능하지만, 그들이 동일하지 않습니다 완전히 읽지 않고. 이것은 해시 함수 사용 또는 단락 비교와 같은 다양한 방식으로 수행 할 수 있습니다.

두 파일 모두에 대한 전체 읽기를 피할 수 없다는 것이 두렵습니다.

먼저 파일의 크기를 모두 확인할 수 있습니다. 다른 경우 파일이 다릅니다 (그러나 라인 분리기에서만 다른 텍스트 파일은 어떻습니까?).

크기가 동일하다면 더 나아가는 올바른 방법이 없지만 두 파일을 모두 읽기 시작합니다. 물론 버퍼가 다른 즉시 중지 될 수는 있지만 파일 만 말할 수 있습니다. 진짜 마지막 캐릭터가 처리 된 경우와 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top