Como obter arquivos compactados 100% idênticos, para arquivos de origem que diferem apenas na data de criação?

8

Desejo poder compactar um arquivo sem perdas e, se o arquivo original for idêntico ao arquivo de outro usuário, desejo que os dois arquivos compactados correspondam, mesmo que as datas do arquivo original sejam diferentes .

Quero usar no máximo 1 GB de RAM durante a compactação. Estou inclinado a um algoritmo assimétrico, porque os arquivos que tenho são bastante grandes e demoram pelo menos uma hora para compactar com o LZMA1 "ultra" em 7-zip em uma máquina P4 com 1 GB de RAM e mais nada em execução. Eu acho que 7-zip e FreeARC podem ser usados ​​para meus propósitos. Tentei encontrar os comandos que deveria estar usando, mas não estou tendo muita sorte.

edit : arquivos 100% idênticos devem ser produzidos, mesmo que as datas de criação sejam diferentes. Isso deve ser possível através de --nodates no Freearc e com ???? em 7 zip. Estou procurando um comando equivalente para 7-zip e uma maneira de padronizar a compactação em vários computadores.

Andy
fonte
11
Você tem certeza de que o LZMA é determinístico?
Ignacio Vazquez-Abrams
2
Expanda a parte de não ter muita sorte .
Fideli
2
Onde esta a pergunta? Qualquer programa de compactação deve ser sem perdas, a menos que seja especificamente feito com perdas.
Pausado até novo aviso.

Respostas:

11

Crie alguns arquivos idênticos:

$ echo hello > file1.test
$ echo hello > file2.test

gzip eles ...

$ gzip file1.test
$ gzip file2.test

observe o campo timestamp como a única diferença:

$ hexdump file1.test.gz

0000000 8b1f 0808 TIME STMP 0300 6966 656c 2e31
0000010 6574 7473 cb00 cd48 c9c9 02e7 2000 3a30
0000020 0636 0000 0000                         

Para mais informações sobre o registro de data e hora, consulte o RFC

Agora, você pode pegar um MD5 que inicia após o byte 8, zerar esses quatro bytes em seus arquivos e perder seus carimbos de data / hora ou extrair o CRC16 desses gzips (consulte também a RFC para obter informações sobre como extrair isso)

Ou você pode salvar sem o carimbo de data e hora:

$ echo test > file1.test
$ echo test > file2.test
$ gzip -n file1.test
$ gzip -n file2.test
$ md5sum file1.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82  file1.test.gz
$ md5sum file2.test.gz
cfe4ddf1c4c3891b4ff4a1269b42db82  file2.test.gz
Gareth Davidson
fonte
11
E, se nenhuma outra porta gzipestiver disponível para Windows, o Cygwin a fornecerá.
Arjan #
3

Não é uma resposta direta à sua pergunta, mas pode ser útil de qualquer maneira.

Há muito tempo (um milênio diferente) eu tive o mesmo problema. Queríamos saber se os arquivos compactados eram iguais, sem descompactá-los e compará-los.

Nossa solução foi obter uma md5sum do arquivo antes de compactá-lo, compactamos o arquivo e o renomeamos para md5sum.zip (.zip ou .tar.gz ou .rar ou .whatever) . Dessa forma, sabíamos que, se dois arquivos tivessem o mesmo nome (sem sufixo), eles eram idênticos.

Nifle
fonte
2
Agradável, embora, naturalmente sabíamos deve ler assumimos ;-)
Arjan
Também é bom, pois é totalmente independente da taxa de compactação: arquivos compactados criados por programas diferentes ou usando configurações diferentes ainda podem ser reconhecidos como sendo os mesmos.
Arjan #
11
Este artigo praticamente tentativas para resolver o mesmo problema ... medium.com/@mpreziuso/...
Xcore
2

O pristine-tar possui uma versão hackeada do gzip que sempre produz os mesmos resultados (e outra para o bzip2). Escolha uma variante do algoritmo e um carimbo de data e hora e pronto.

Tobu
fonte
1

Entre nas fontes do 7-zip. Onde lê a data do arquivo, basta inserir o código para alterar a data para 01.01.1997, ou qualquer outra coisa - corrigida para todos os arquivos. Compile com um nome diferente e use-o.

kagali-san
fonte