2010-07-21 35 views
11

Tôi chưa bao giờ thực sự nhìn vào nó nhưng bây giờ tôi nhận ra rằng tôi không thể dễ dàng xây dựng hai tệp .jar giống hệt nhau.Java/zip: Tại sao các tệp .jar được tạo không xác định?

Ý tôi là, nếu tôi xây dựng hai lần, mà không thay đổi bất cứ điều gì, tôi sẽ có cùng kích thước chính xác nhưng tổng kiểm tra khác nhau cho số .jar.

Vì vậy, tôi nhanh chóng chạy một số kiểm tra (về cơ bản giải nén, loại -n -k 5 'ing và sau đó diff' ing) để thấy rằng tất cả các file bên các .jar là giống hệt nhau, nhưng .jar khác nhau.

Vì vậy, tôi đã làm một thử nghiệm với một đồng bằng .zip tập tin và thấy điều này:

... $ zip 1.zip a.txt 
... $ zip 2.zip a.txt 
... $ ls -l ?.zip 
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 1.zip 
-rw-rw-r-- 1 webinator webinator 147 2010-07-21 13:09 2.zip 

(chính xác cùng .zip kích thước tập tin)

... $ sha1sum ?.zip 
db99f6ad5733c25c0ef1695ac3ca3baf5d5245cf 1.zip 
eaf9f0f92eb2ac3e6ac33b44ef45b170f7984a91 2.zip 

(khác nhau SHA-1 số tiền, hãy xem tại sao)

$ hexdump 1.zip -C > 1.txt 

$ hexdump 2.zip -C > 2.txt 

$ diff 1.txt 2.txt 
3c3 
< 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*4e*d5 46 4c |txtUT.....FLN.FL| 
--- 
> 00000020 74 78 74 55 54 09 00 03 ab d4 46 4c*5d*d5 46 4c |txtUT.....FL].FL| 

Giải nén cả hai tệp zip chắc chắn sẽ trả về tệp duy nhất của chúng tôi.

Câu hỏi: tại sao vậy? (Tôi sẽ trả lời bản thân mình)

+1

Tại sao bạn đặt câu hỏi khi bạn đã biết câu trả lời? – Gumbo

+1

@Gumbo: Tôi tìm thấy câu trả lời trong khi gõ câu hỏi (tại sao SO cho phép một câu trả lời cho câu hỏi của riêng mình? :) và tìm ra câu hỏi có thể thu hút người khác (trong đó có hai upvotes trong số mười lượt xem có vẻ như chỉ ra :) – SyntaxT3rr0r

+0

Tại sao downvote? – SyntaxT3rr0r

Trả lời

6

(Trả lời cho bản thân mình) Đó là bởi vì các định dạng tập tin .zip tiết kiệm thời gian sáng tạo và sửa đổi trong tiêu đề của nó.

Nếu bạn thực sự muốn tạo hai giống hệt .zip (hoặc .jar), bạn cần phải thực hiện điều thứ hai tin rằng nó được tạo/chỉnh sửa chính xác tại cùng một thời gian như là người đầu tiên.

+3

Sau đó, nó được tạo ra một cách xác định ... –

+1

@ Thorbjørn Ravn Andersen: chắc chắn, nếu bạn có thể dự đoán chính xác thứ hai tất cả các lớp của bạn sẽ được biên soạn và sẽ được nén lại với nhau;) – SyntaxT3rr0r

+2

Tôi nghĩ rằng bạn đang nhầm lẫn với xác định giống hệt nhau. .. chúng không giống nhau. Phương tiện xác định được xây dựng theo cùng một kiểu thời trang, không phải là các byte giống hệt nhau cần thiết. Bạn có thể dễ dàng thực hiện nhị phân trên các tệp và thấy rằng tất cả đã thay đổi là dấu thời gian (đó là điều mà một trong những khách hàng chính của chúng tôi phải làm để có được các phụ thuộc mới được kiểm tra vào repo của họ ... và là một nỗi đau để họ làm , nhưng họ làm điều đó bởi vì họ cần phải đảm bảo rằng những tập tin này với các hash khác nhau là giống hệt nhau). – corsiKa

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