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

7

Eu quero ser capaz de compactar um arquivo sem perdas, e se o arquivo original é idêntico ao arquivo de outro usuário, eu quero que ambos os arquivos compactados para corresponder, mesmo se as datas originais do arquivo são diferentes .

Eu quero usar no máximo 1GB de RAM ao compactar. Eu estou inclinado para um algoritmo assimétrico porque os arquivos que eu tenho são bastante grandes, e eles levam pelo menos uma hora para compactar com LZMA1 "ultra" em 7-zip em uma máquina P4 com 1GB de RAM e nada mais em execução. Eu acho que o 7-zip e o FreeARC podem ser usados para os meus propósitos. Eu 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 deveria ser possível através de - nodates em Freearc, e com ???? em 7-zip. Estou procurando um comando equivalente para o 7-zip e uma maneira de padronizar a compactação em vários computadores.

    
por Andy 20.11.2010 / 17:18

4 respostas

10

Crie alguns arquivos idênticos:

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

gzip-los ...

$ gzip file1.test
$ gzip file2.test

observe o campo de 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 timestamp, consulte a RFC

Agora, você pode pegar um MD5 que inicia após o byte 8, zero esses quatro bytes em seus arquivos e perder seus timestamps, ou extrair o CRC16 desses gzips (veja também o RFC para informações sobre como extrair isso)

Ou você pode salvar sem o timestamp:

$ 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
    
por 20.11.2010 / 18:07
3

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

Muito tempo atrás (um milênio diferente) eu tive o mesmo problema. Queríamos saber se os arquivos compactados eram os mesmos sem descompactá-los e compará-los.

Nossa solução foi obter um md5sum do arquivo antes de compactá-lo, depois compactamos o arquivo e renomeou 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 seriam idênticos.

    
por 20.11.2010 / 17:53
2

pristine-tar tem uma versão hackeada do gzip que sempre produz os mesmos resultados (e outro para bzip2). Escolha uma variante de algoritmo e um timestamp e você está pronto para ir.

    
por 20.11.2010 / 23:35
1

Invada as fontes do 7-zip. Onde ele 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.

    
por 20.11.2010 / 22:46