Voglio creare un modo rapido per rilevare se un file potrebbe essere o meno lo stesso. Per quasi il 100% di sicurezza userei un algoritmo di hash esistente, ad esempio SHA256. Tuttavia, ci si aspetta che i file siano enormi file video con diversi GB, quindi il calcolo dell'hash SHA256 potrebbe richiedere del tempo, specialmente attraverso la rete.
Pertanto voglio combinare diverse altre tecniche:
- dimensione del file: se la dimensione del file è cambiata, il contenuto è cambiato (sicuro)
- hash testa / coda
- hash casuale
Gli ultimi 2 fanno parte della mia domanda:
La mia ipotesi sarebbe che nell'intestazione ci siano cose come:
- frame rate (ad es. video)
- risoluzione (ad es. video, immagini)
- (file) lunghezza (ad es. in cornici, pixel ecc.)
- data dell'ultima modifica (ad es. documenti di Word, non specificamente video)
Perché prendo in considerazione il controllo della coda è:
- MP3 ha le informazioni sui tag lì
- EXIF aggiunge dati personalizzati alla fine, se ho ragione
Gli hash casuali selezionerebbero ad esempio 126 regioni in posizioni casuali nel file con una lunghezza specifica, ad esempio 64 kB e creerebbero un hash per loro. Ovviamente ricordo gli offset per un successivo confronto. Tutto sommato userei (1 + 126 + 1) * 64 kB di dati per il mio hash, quindi ho bisogno di leggere solo 8 MB invece di diversi GB per ottenere l'hash.
Forse è più una domanda matematica ora, ma: quanto è probabile rilevare un cambiamento usando la combinazione di dimensioni del file, testa, coda e dati casuali per generare questa somma hash veloce?
Presumo che i file siano sempre file legali. Non vi è alcun vantaggio nella manipolazione di singoli byte. L'utente utilizza un normale strumento di editing video per modificare i file.
AGGIORNAMENTO : non ho accettato questa risposta che proveniva da Crypto.StackExchange. Concordo sul fatto che la mia proposta non è crittografica e non intende essere sicura. Concordo anche sul fatto che CRCing di un file sia veloce, ma nel mio caso ho davvero bisogno di un hash - spiegherò perché:
- La mia applicazione dovrebbe salvare i segnalibri nei video. Il mio database dovrebbe salvare l'hash del video e i segnalibri.
- Gli utenti a volte spostano o rinominano i file. Il mio programma noterà che un file non esiste più, ma non eliminerà i segnalibri dal database. Invece, quando lo stesso video viene riprodotto (accidentalmente) di nuovo, voglio riconoscere che è (probabilmente) lo stesso file.
- Gli utenti devono salvare i file su unità di rete (NAS) e trasmettere video in streaming. Quelli sono stupidi depositi. Non riesco a installare un componente server. E potrebbero essere abbastanza lenti, quindi non voglio davvero l'hash completo. Il calcolo di un hash completo su un file da 3 GB richiede almeno 5 minuti a 10 MB / s, indipendentemente dalla velocità dell'algoritmo di hashing.
- Se l'utente ha modificato il file, spero in qualche modo che l'hash non corrisponda più, perché altrimenti visualizzerei segnalibri errati.
Starei bene con una probabilità dell'80% di avere i segnalibri corretti. Quanti pezzi di hash dovrei mettere insieme e dove nel file sarebbe?