Chcę móc kompresować plik bezstratnie, a jeśli oryginalny plik jest identyczny z plikiem innego użytkownika, chcę, aby oba nasze skompresowane pliki były zgodne, nawet jeśli daty oryginalnych plików są różne .
Chcę używać maksymalnie 1 GB pamięci RAM podczas kompresji. Skłaniam się ku algorytmowi asymetrycznemu, ponieważ pliki, które mam, są dość duże, a kompresja za pomocą LZMA1 „ultra” w 7-zipie zajmuje co najmniej godzinę na maszynie P4 z 1 GB pamięci RAM i nic więcej nie działa. Myślę, że do moich celów można użyć 7-zip i FreeARC. Próbowałem znaleźć polecenia, których powinienem używać, ale nie mam szczęścia.
edycja : należy wygenerować w 100% identyczne pliki, nawet jeśli daty utworzenia są inne. Powinno to być możliwe poprzez --nodates w Freearc oraz z ???? w 7 suwakach. Szukam równoważnego polecenia dla 7-zip i sposobu standaryzacji kompresji na wielu komputerach.
źródło
Odpowiedzi:
Utwórz kilka identycznych plików:
zgzipuj je ...
obserwuj pole znacznika czasu jako jedyną różnicę:
Aby uzyskać więcej informacji na temat znacznika czasu, zobacz RFC
Teraz możesz albo wziąć MD5, który zaczyna się po bajcie 8, wyzerować te cztery bajty w swoich plikach i stracić ich znaczniki czasu, lub wyodrębnić CRC16 z tych gzips (zobacz także RFC, aby uzyskać informacje o tym, jak to wyodrębnić)
Lub możesz zapisać bez znacznika czasu:
źródło
gzip
są dostępne dla systemu Windows, Cygwin je udostępnia.Nie jest to bezpośrednia odpowiedź na twoje pytanie, ale i tak może ci pomóc.
Dawno temu (inne tysiąclecie) miałem ten sam problem. Chcieliśmy wiedzieć, czy skompresowane pliki są takie same bez ich dekompresowania i porównywania.
Nasze rozwiązanie było uzyskać md5 pliku przed ściskając go, potem skompresowany plik i przemianowano go
md5sum.zip
(.zip lub .tar.gz lub .rar lub .whatever) . W ten sposób wiedzieliśmy, że jeśli dwa pliki mają tę samą nazwę (bez przyrostka), to są one identyczne.źródło
pristine-tar ma zhakowaną wersję gzip, która zawsze daje takie same wyniki (i inną dla bzip2). Wybierz wariant algorytmu i znacznik czasu i gotowe.
źródło
Włam się do źródeł 7-zip. Tam, gdzie odczytuje datę pliku, po prostu wstaw kod, aby zmienić datę na 01.01.1997 lub cokolwiek innego - naprawionego dla wszystkich plików. Skompiluj pod inną nazwą i użyj jej.
źródło