Tôi đang cố gắng thiết kế một ứng dụng đơn giản để được sử dụng để tính toán một tệp CRC32/md5/sha1/sha256/sha384/sha512 và tôi đã gặp phải một chút rào cản. Điều này đang được thực hiện trong C#.Làm thế nào để băm một tập tin duy nhất nhiều cách cùng một lúc?
Tôi muốn có thể thực hiện điều này một cách hiệu quả nhất có thể, vì vậy suy nghĩ ban đầu của tôi là đọc tệp vào bộ nhớ trước khi xử lý, nhưng tôi sớm phát hiện ra rằng các tệp rất lớn khiến tôi hết bộ nhớ rất nhanh. Vì vậy, có vẻ như tôi phải sử dụng một bộ phim để thay thế. Vấn đề, như tôi thấy, là chỉ có một hàm băm có thể chạy cùng một lúc và làm như vậy với một luồng phim sẽ mất một lúc để mỗi băm hoàn thành.
Làm cách nào để đọc một tệp nhỏ vào bộ nhớ, xử lý nó bằng tất cả 6 thuật toán, sau đó chuyển sang một đoạn khác ... Hoặc băm không hoạt động theo cách đó?
Đây là nỗ lực ban đầu của tôi khi đọc tệp vào bộ nhớ. Nó thất bại khi tôi đã cố gắng để đọc một tập tin ảnh CD vào bộ nhớ trước khi chạy các thuật toán băm trên MemoryStream: thuật toán
private void ReadToEndOfFile(string filename)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[16 * 1024];
//double step = Math.Floor((double)fi.Length/(double)100);
this.toolStripStatusLabel1.Text = "Reading File...";
this.toolStripProgressBar1.Maximum = (int)(fs.Length/buffer.Length);
this.toolStripProgressBar1.Value = 0;
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
this.toolStripProgressBar1.Value += 1;
}
_ms = ms;
}
}
}
Tôi đã thử làm việc này bằng MD5 và chương trình chạy, mặc dù chương trình có vẻ như đang tạo băm không đúng. Đây là liên kết tới mã của tôi: [link] (http://pastebin.com/i3iPwYZv) – agent154
Bạn nên sử dụng 'read' thay vì' buffer.Length' khi gọi 'TransformFinalBlock' –
Cảm ơn rất nhiều! Tôi đã rất đau đớn về điều này trong một thời gian tối qua. Kết thúc với việc hack một thứ gì đó ngu ngốc đang tìm cách để nó hoạt động, nhưng tôi không thể không cảm thấy rằng nó không cần thiết. Tôi phát hiện ra rằng đó là vì mảng cuối cùng đã được đọc hoàn toàn ngay cả khi đoạn cuối cùng quá nhỏ cho nó. Tôi đã kết thúc làm cho nó tạo ra một mảng byte mới cho mảnh cuối cùng bằng kích thước của đoạn cuối cùng. – agent154