2014-06-24 30 views
5

Tôi cần một chức năng sao chép thông minh để sao chép tập tin đáng tin cậy và nhanh chóng & liên kết. Các tệp này rất lớn (từ vài gigabyte đến hơn 200GB) và phân phối trên nhiều thư mục với mọi người đổi tên tệp và có thể là thư mục trong ngày, vì vậy tôi muốn sử dụng băm để xem liệu tôi đã sao chép tệp chưa một tên khác và chỉ tạo liên kết trong trường hợp đó.Chức năng "băm nhanh" này có nguy hiểm không?

Im hoàn toàn mới để băm và tôi đang sử dụng chức năng này vào đây để băm:

import hashlib 

def calculate_sha256(cls, file_path, chunk_size=2 ** 10): 
    ''' 
    Calculate the Sha256 for a given file. 

    @param file_path: The file_path including the file name. 
    @param chunk_size: The chunk size to allow reading of large files. 
    @return Sha256 sum for the given file. 
    ''' 
    sha256 = hashlib.sha256() 
    with open(file_path, mode="rb") as f: 
     for i in xrange(0,16): 
      chunk = f.read(chunk_size) 
      if not chunk: 
       break 
      sha256.update(chunk) 
    return sha256.hexdigest() 

này có một phút cho một tập tin 3GB, vì vậy cuối cùng, quá trình này có thể rất chậm đối với một 16TB HD.

Bây giờ ý tưởng của tôi là sử dụng một số kiến ​​thức bổ sung về cấu trúc nội bộ của tệp để tăng tốc độ: Tôi biết chúng chứa một tiêu đề nhỏ, sau đó có rất nhiều dữ liệu đo lường và tôi biết chúng chứa dấu thời gian thực. Tôi khá chắc chắn rằng cơ hội đó, giả sử, 16MB đầu tiên của hai tệp giống nhau, rất thấp (để điều đó xảy ra, hai tệp sẽ cần phải được tạo chính xác cùng một lúc trong cùng một điều kiện môi trường) . Vì vậy, kết luận của tôi là nó sẽ là đủ để chỉ băm X MB đầu tiên của mỗi tập tin.

Nó hoạt động trên dữ liệu ví dụ của tôi, nhưng khi tôi chưa từng trải nghiệm, tôi chỉ muốn hỏi liệu có điều gì đó tôi không biết (ẩn nguy hiểm hoặc cách tốt hơn để làm điều đó).

Cảm ơn bạn rất nhiều!

+2

http://codereview.stackexchange.com/ – vaultah

+1

Bạn cần thực hiện phép tính và xem khả năng bạn có một vụ va chạm ngoài ý muốn hoặc bạn cần đảm bảo rằng các tệp khác nhau * luôn có * tiêu đề khác . Trong trường hợp sau, bạn có thể * chắc chắn * chỉ kiểm tra phần đầu. Trong trường hợp trước đây, bạn cần tự quyết định xem khả năng va chạm có phải là thứ bạn có thể sống cùng hay không. Rất khó để giúp đỡ mà không biết dữ liệu của bạn. –

+1

Bạn có thể tránh tái phát minh bánh xe và sử dụng [rsync] (http://en.wikipedia.org/wiki/Rsync). –

Trả lời

3

Bạn có thể nhận được băm MD5 của các tệp lớn, theo breaking them into small byte chunks.

Ngoài ra, tính toán MD5 băm là đáng kể faster than SHA-256 và nên được ưa chuộng vì lý do hiệu suất cho bất kỳ ứng dụng mà không dựa trên băm cho các mục đích an ninh.

+0

Tôi lấy tất cả các bình luận và câu trả lời, các liên kết được cung cấp và bây giờ tôi đang sử dụng md5, băm 16MB đầu tiên, và nếu tôi phát hiện hai tệp có cùng giá trị băm, tôi tính lại giá trị băm của chúng cho 32MB, sau đó cho 64MB, sau đó .. , cho đến khi băm bắt đầu khác, một tập tin báo cáo EoF nhưng không có (xem hai trường hợp "không bằng nhau") hoặc cả hai tệp báo cáo EoF và băm là như nhau (xem xét các tệp bằng nhau). Cảm ơn tất cả! – Blutkoete

Các vấn đề liên quan