Quiero crear una forma rápida de detectar si un archivo puede o no ser el mismo. Para casi el 100% de seguridad, usaría un algoritmo hash existente, por ejemplo, SHA256. Sin embargo, se espera que los archivos sean archivos de video enormes con varios GB, por lo que calcular el hash SHA256 podría llevar algún tiempo, especialmente a través de la red.
Por lo tanto, quiero combinar otras técnicas diferentes:
- tamaño del archivo: si el tamaño del archivo ha cambiado, el contenido ha cambiado (seguro)
- hash de cabeza / cola
- hash aleatorio
Los últimos 2 son parte de mi pregunta:
Supongo que en el encabezado hay cosas como:
- velocidades de cuadro (por ejemplo, videos)
- resolución (por ejemplo, videos, imágenes)
- (archivo) longitud (por ejemplo, en cuadros, píxeles, etc.)
- última fecha de cambio (por ejemplo, documentos de Word, no específicamente videos)
Por qué considero revisar la cola es:
- MP3 tiene la información de la etiqueta allí
- EXIF agrega datos personalizados al final si tengo razón
Los hashes aleatorios seleccionarían, por ejemplo, 126 regiones en posiciones aleatorias en el archivo con una longitud específica, por ejemplo, 64 kB y crearían un hash para ellos. Por supuesto que recuerdo las compensaciones para una comparación posterior. En general, usaría (1 + 126 + 1) * 64 kB de datos para mi hash, por lo que necesito leer solo 8 MB en lugar de varios GB para obtener el hash.
Tal vez es más una pregunta matemática ahora, pero: ¿qué tan probable es detectar un cambio usando la combinación de tamaño de archivo, encabezado, cola y datos aleatorios para generar esta suma rápida de hash?
Supongo que los archivos son siempre archivos legales. No hay beneficio en la manipulación de bytes individuales. El usuario usaría una herramienta de edición de video normal para cambiar los archivos.
ACTUALIZACIÓN : no acepté esta respuesta que vino de Crypto.StackExchange. Estoy de acuerdo en que mi propuesta no es criptográfica y no pretende ser segura. También estoy de acuerdo en que CRCing un archivo es rápido, pero en mi caso realmente necesito un hash. Explicaré por qué:
- Se espera que mi aplicación guarde marcadores en videos. Se espera que mi base de datos guarde el hash de video y los marcadores.
- Los usuarios a veces mueven o renombran archivos. Mi programa notará que un archivo ya no existe, pero no eliminará los marcadores de la base de datos. En cambio, cuando el mismo video se reproduce (accidentalmente) nuevamente, quiero reconocer que es (probablemente) el mismo archivo.
- Se espera que los usuarios guarden archivos en unidades de red (NAS) y transmitan videos. Esos son almacenamientos tontos. No puedo instalar un componente del servidor. Y pueden ser bastante lentos, así que realmente no quiero el hash completo. Calcular un hash completo en un archivo de 3 GB lleva al menos 5 minutos a 10 MB / s, sin importar cuán rápido sea el algoritmo de hash.
- Si el usuario ha editado el archivo, de alguna manera espero que el hash no coincida más, porque de lo contrario mostraría marcadores incorrectos.
Estaría bien con un ~ 80% de posibilidades de tener los marcadores correctos. ¿Cuántas piezas hash debo juntar y en qué parte del archivo estarían?