我知道使用人们已经发明的校验和算法总是更好。我希望能够通过执行校验和来比较两个文件是否相同。这些文件通过网络位于两台不同的计算机中,并且由于它们跨网络,因此在处理像我这样的大文件时,执行校验和而不是复制整个文件会更快。(我将首先执行其他测试,例如确保文件长度相同等。)
所以我创建了这个简单的算法:
private static double GetChecksum2(string file)
{
double checkSum = 0;
var stream = File.OpenRead(file);
// the bigger the chunck size the faster but the more memory usage by cpu
// also when sending file over network it should not be that much more efficient
int chunckSize = (int) Math.Pow(2,20); // 10 => kilobite 20 => megabite 30 => gigabite etc..
byte[] buffer = new byte[chunckSize];
int bytesRead = 0;
while ( // while bytesRead > 0
(bytesRead =
(stream.Read(buffer, 0, buffer.Length)) // returns the number of bytes read or 0 if no bytes read
) > 0)
{
//buffer is now an array of size bytesRead
// write those bytes to a file, perform checksum of file
// etc...
// temp check sum use a better algorithm I dont know if other computers will round
// doubles diferently
for (int i = 0; i < bytesRead; i++)
{
checkSum = (((buffer[i] + i)/2 + checkSum))*.45;
}
//SHA256Managed sha = new SHA256Managed();
//byte[] checksum = sha.ComputeHash(buffer);
}
return checkSum;
}
我不知道使用此算法实现两个不同文件的校验和的几率是多少。
执行 1.06 GB 文件的校验和时,需要:5.2 秒完成,校验和为 321840.207306214
当我使用 SHA256Managed() 算法时,它需要 35.8 秒。
长 7 倍
我知道两个文件具有相同校验和的可能性与此算法不同,它们的可能性远低于我的算法。但是使用我的算法要快得多,我认为几率应该也很低......
或者也许我应该使用一个我不知道并且它已经存在的更快的算法......
编辑
我的问题是:
实现这个算法是否安全。我需要通过我的网络进行大量文件传输,如果我可以使用校验和算法来比较文件,那就太好了。也许我可以将每个文件拆分成块,然后替换校验和不匹配的块!