Tính toán md5sum của mỗi phần 1 MB của luồng từ đường ống


2

Tôi muốn thực hiện kiểm tra các tệp lớn và phát trực tuyến trong unix / linux và tôi muốn nhận được nhiều tổng kiểm tra từ mọi phần lớn của tệp / luồng, cứ 1 MB hoặc mỗi 10 MB.

Ví dụ, tôi có hình ảnh đĩa, hình ảnh đĩa nén và bản sao của đĩa gốc. Một số phần của hình ảnh có thể được sửa đổi. Đĩa có dung lượng 50 GB và có khoảng 50000 khối 1 MB. Vì vậy, với mỗi tệp tôi muốn nhận 50 000 md5sum hoặc sha1sums để có tổng quan về sửa đổi. Single md5sum sẽ không giúp tôi xác định vị trí bù sửa đổi.

Nhiệm vụ này dễ dàng cho hình ảnh đĩa không nén, với việc sử dụng dd công cụ trong for lặp trong bash với tính toán bù đắp và chọn (bỏ qua) mỗi phần 1 MB của tệp. Tương tự với đĩa:

for a in `seq 1 50000`; do echo -n "$a: "; dd if=image.src bs=1M count=1 skip=$a | md5sum; done

Nhưng bây giờ tôi muốn so sánh ảnh nén và không nén mà không giải nén nó vào đĩa. Tôi có 7z giải nén có thể giải nén hình ảnh thành thiết bị xuất chuẩn với tốc độ cao, lên tới 150-200 MB / s (tùy chọn 7z e -so image.7z | ). Nhưng tôi có thể viết gì sau | biểu tượng để có được md5sum của tất cả các phần tập tin.

Câu trả lời:


2

Một cái gì đó đơn giản như kịch bản Perl này có lẽ sẽ đủ.

$amount = 1_000_000;
while (read(STDIN, $buffer, $amount) > 0) {
    open MD5, "|md5";
    print MD5 $buffer;
    close MD5;
}

Đặt cái này vào foo.pl và gọi nó là perl foo.pl ở cuối đường ống của bạn.


Phiên bản tuyệt vời, cảm ơn bạn. Tôi vừa hoàn thành việc sử dụng của riêng tôi Crypt::Rhash (md5 + sha1 + tiger - vẫn còn khá nhanh). Bạn có thể thay đổi mã của tôi để dễ đọc và phong cách hơn.
osgx

Và kịch bản cho thấy hình ảnh của tôi giống với ổ cứng của tôi, nhưng không giống nhau. Tôi gần như đã phá hủy 50 GB dữ liệu độc đáo.
osgx

6

chia từ coreutils (mặc định trên hầu hết các bản phân phối Linux) có một --filter tùy chọn mà bạn có thể sử dụng:

7z e -so image.7z | split -b 1000000 --filter=md5sum

Tiện lợi Tôi không biết về điều này.
Kyle Jones

0

Dường như với tôi rằng bạn đang tìm kiếm loại này dụng cụ .

Từ tệp Readme của BigSync:

Bigsync là một công cụ để sao lưu dần dần một tệp lớn vào một   đích đến chậm (nghĩ rằng phương tiện truyền thông mạng hoặc một NAS giá rẻ). Phổ biến nhất   trường hợp cho bigsync là hình ảnh đĩa, hệ điều hành ảo, khối lượng được mã hóa và   thiết bị thô.

Bigsync sẽ đọc tệp nguồn trong các khối tính toán tổng số cho   mỗi cái. Nó sẽ so sánh chúng với các giá trị được lưu trữ trước đó cho   tập tin đích và ghi đè thay đổi khối nếu tổng kiểm khác nhau.

Bằng cách này, chúng tôi giảm thiểu quyền truy cập vào phương tiện mục tiêu chậm, đó là   toàn bộ quan điểm về sự tồn tại của bigsync.


"Bigsync sẽ đọc tệp nguồn theo từng phần tính toán tổng kiểm tra cho từng cái" - phần này là đúng, nhưng tôi không muốn sửa đổi bất cứ điều gì.
osgx

0

Thật dễ dàng để viết 1 MB nhỏ bằng cách sử dụng rhash công cụ ( librhash thư viện). Có tập lệnh perl đơn giản tạo tổng kiểm tra của mỗi phần 1 MB của luồng đầu vào tiêu chuẩn. Nó cần Crypt::Rhash ràng buộc từ cpan:

$ cpan
(cpan) install Crypt::Rhash
$ cat rhash1M.pl
#!/usr/bin/perl
# Compute md5 and sha1 sum of every 1 MB part of stream

use strict;
use local::lib;
use Crypt::Rhash;

my ($buf, $len, $i);
my $r=Crypt::Rhash->new(RHASH_MD5|RHASH_SHA1);
# we can add more hashes, like RHASH_TIGER etc
binmode STDIN;
$i=0;
while($len= read STDIN,$buf,1024*1024){
    print "$i+$len: \t"; # print offset
    $r->update($buf);
    print "md5:",$r->hash(RHASH_MD5), " sha1:", $r->hash(RHASH_SHA1),"\n";
    $r->reset(); # reset hash calculator
    $i+=$len; 
}

Tập lệnh miền công cộng này sẽ xuất ra phần bù thập phân, sau đó +, sau đó kích thước khối, sau đó tổng md5 và sha1 của đầu vào.

Ví dụ: 2 MB số 0 có tổng:

$ dd if=/dev/zero of=zerofile bs=1M count=2
$ ./rhash1M.pl < zerofile 
0+1048576:  md5:b6d81b360a5672d80c27430f39153e2c sha1:3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3 
1048576+1048576:    md5:b6d81b360a5672d80c27430f39153e2c sha1:3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3

0

rsync hoạt động như thế này, tính toán tổng kiểm tra để xem liệu có sự khác biệt trong các phần của tệp trước khi gửi bất cứ điều gì không.

Tôi không chắc nó sẽ hoạt động tốt như thế nào với các tệp lớn như vậy, mặc dù tôi chưa bao giờ nghe nói rằng nó có bất kỳ giới hạn kích thước tệp nào.


0

Lấy đầu ra cho tập lệnh Python 2 này, ví dụ 7z e -so image.7z | python md5sum.py:

import sys, hashlib
CHUNK_SIZE = 1000 * 1000
for chunk in iter(lambda: sys.stdin.read(CHUNK_SIZE), ''):
    print hashlib.new('md5', chunk).hexdigest()

1
Đầu vào là gì? Cái này hoạt động ra sao? Người dùng làm gì, từ bước 1 đến bước x ? Đây là một câu trả lời chất lượng thấp như là.
Canadian Luke

Vui lòng thêm thông tin vào bài đăng này (những gì mỗi dòng làm, vv Chỉ cần thêm ý kiến). Tôi nhấn Trông có vẻ tốt trong hàng đợi LQP vì tôi thấy cách khắc phục dễ dàng nhưng vì đó là LQP.
Jon

@CanadianLuke, tôi đã giải thích cách sử dụng nó.
Cristian Ciupitu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.