Quero criar uma maneira rápida de detectar se um arquivo pode ou não ser o mesmo. Para quase 100% de certeza, eu usaria um algoritmo de hash existente, por exemplo, SHA256. No entanto, espera-se que os arquivos sejam enormes arquivos de vídeo com vários GB, portanto, o cálculo do hash SHA256 pode levar algum tempo, especialmente na rede.
Portanto, eu quero combinar diferentes outras técnicas:
- tamanho do arquivo: se o tamanho do arquivo foi alterado, o conteúdo foi alterado (com certeza)
- hash cabeça / cauda
- mistura aleatória
Os dois últimos fazem parte da minha pergunta:
Meu palpite seria que no cabeçalho existem coisas como:
- taxas de quadros (por exemplo, vídeos)
- resolução (por exemplo, vídeos, imagens)
- (arquivo) comprimento (por exemplo, em quadros, pixels etc.)
- data da última alteração (por exemplo, documentos do Word, não especificamente vídeos)
Por que considero verificar a cauda é:
- O MP3 contém as informações da etiqueta
- EXIF adiciona dados personalizados no final, se eu estiver certo
Os hashes aleatórios selecionariam, por exemplo, 126 regiões em posições aleatórias no arquivo com um comprimento específico, por exemplo, 64 kB e criariam um hash para elas. É claro que me lembro das compensações para comparação posterior. No geral, eu usaria (1 + 126 + 1) * 64 kB de dados para meu hash, portanto, preciso ler apenas 8 MB em vez de vários GB para obter o hash.
Talvez seja mais uma questão de matemática agora, mas: qual a probabilidade de detectar uma alteração usando a combinação de tamanho do arquivo, cabeçalho, cauda e dados aleatórios para gerar essa soma rápida de hash?
Presumo que os arquivos sejam sempre legais. Não há benefício em manipular bytes únicos. O usuário usaria uma ferramenta normal de edição de vídeo para alterar os arquivos.
UPDATE : Eu aceitei esta resposta que veio do Crypto.StackExchange. Concordo que minha proposta não é criptográfica e não pretende ser segura. Também concordo que o CRC de um arquivo é rápido, mas no meu caso eu realmente preciso de um hash - vou explicar o porquê:
- Espera-se que meu aplicativo salve marcadores em vídeos. Espera-se que meu banco de dados salve o hash do vídeo e os favoritos.
- Às vezes, os usuários movem ou renomeiam arquivos. Meu programa notará que um arquivo não existe mais, mas não excluirá os indicadores do banco de dados. Em vez disso, quando o mesmo vídeo é (acidentalmente) reproduzido novamente, quero reconhecer que é (provavelmente) o mesmo arquivo.
- Os usuários devem salvar arquivos em unidades de rede (NAS) e transmitir vídeos. Esses são estúpidos armazéns. Não consigo instalar um componente do servidor. E eles podem ser bem lentos, então eu realmente não quero o hash completo. O cálculo de um hash completo em um arquivo de 3 GB leva pelo menos 5 minutos a 10 MB / s, independentemente da velocidade do algoritmo de hash.
- Se o usuário tiver editado o arquivo, espero, de alguma forma, que o hash não corresponda mais, porque, caso contrário, eu exibiria indicadores errados.
Eu ficaria bem com uma chance de ~ 80% de ter os marcadores corretos. Quantas peças de hash eu devo montar e onde estaria o arquivo?