He visto algunas preguntas relacionadas con la determinación de la similitud de los archivos, pero todas están vinculadas a un dominio en particular (imágenes, sonidos, texto, etc.). Las técnicas que se ofrecen como soluciones requieren el conocimiento del formato de archivo subyacente de los archivos que se comparan. Lo que estoy buscando es un método sin este requisito, donde se puedan comparar archivos binarios arbitrarios sin necesidad de entender qué tipo de datos contienen. Es decir, estoy buscando determinar el porcentaje de similitud de los datos binarios de dos archivos.Cálculo de similitud de datos binarios
Para darle un poco más de detalle para que trabaje, aunque esto es potencialmente aplicable a muchas cosas, tengo un problema específico en el que estoy trabajando. Actualmente también tengo una solución de trabajo, pero no creo que sea ideal. Probablemente haya muchas optimizaciones en términos del método de comparación y el almacenamiento de los resultados. Espero que algunas personas aquí puedan darme algunas ideas nuevas. Probablemente edite alguna información sobre mi método actual después de un par de días, pero no quiero sesgar los pensamientos de las personas sobre el problema diciéndoles cómo lo estoy haciendo.
El problema en el que estoy trabajando es detección de clones para imágenes ROM de videojuego. Para aquellos que no tienen experiencia con la emulación, los ROM son volcados de los datos en los cartuchos de juego. Un "clon" ROM es típicamente una versión modificada del mismo juego, el tipo más común es una versión traducida. Por ejemplo, las versiones en japonés e inglés del original Final Fantasy para el NES son clones. Los juegos comparten casi todos sus recursos (sprites, música, etc.), pero el texto ha sido traducido.
Actualmente hay varios grupos que trabajan en el mantenimiento de listas de clones para los distintos sistemas, pero hasta donde sé, todo esto se hace de forma manual. Lo que intento hacer es encontrar un método para detectar imágenes de ROM similares de forma automática y objetiva, en función de la similitud de los datos en lugar de "estos parecen el mismo juego". Existen varias razones para detectar clones, pero una de las principales motivaciones es usarlo con Solid compression. Esto permite la compresión de todos los clones de juegos en el mismo archivo, con todo el conjunto de clones comprimidos ocupando a menudo solo un poco más de espacio que una de las ROM individuales.
Algunas de las preocupaciones a tener en cuenta cuando sube con enfoques posibles:
- ROM varían altamente en tamaño, dependiendo del sistema. Algunos son pequeños, pero los sistemas modernos pueden tener grandes, 256 MB o más. Algunos sistemas (¿todos?) Solo tienen potencias de 2 como posibles tamaños, un juego de 130MB en uno de estos sistemas tendría una ROM de 256MB, en gran parte vacía. Tenga en cuenta que debido a esto, algunos clones pueden tener tamaños muy diferentes, si una versión del juego cruza el umbral y tiene que usar un cartucho que es dos veces el tamaño.
- En la actualidad, existen miles de ROM conocidas en muchos sistemas, y la mayoría de los sistemas aún tienen nuevas liberadas constantemente. Incluso para sistemas más antiguos, existe una gran comunidad de hackers ROM que produce ROM modificados a menudo.
- Almacenar los datos de similitud para cada posible par de ROM daría como resultado millones de filas de datos para cualquiera de los sistemas más populares. Un sistema con 5000 ROM requeriría 25 millones de filas de datos de similitud, con un solo juego nuevo que agrega otras 5000 filas.
- El estado del procesamiento debe ser recuperable, de modo que si se interrumpe puede continuar donde lo dejó. Con cualquier método, se requerirá mucho procesamiento, y asumir que todo se ejecutará en un lote no es seguro.
- Se pueden agregar nuevas ROM en cualquier momento, por lo que el método no debe suponer que ya tiene un conjunto "completo".Es decir, incluso después de haber calculado la similitud para todas las ROM existentes, si se agrega una nueva (y esto también podría ocurrir antes de que el procesamiento anterior haya finalizado por completo) debe haber un método para compararla con todas las anteriores, para determinar cuál (si hay alguno) es un clon de.
- Mayor velocidad de procesamiento debe tener prioridad sobre la precisión (hasta cierto punto). Saber si dos ROM son 94% o 96% similares no es particularmente importante, pero si se tarda un día de procesamiento para comparar una nueva ROM con todas las anteriores, el programa probablemente nunca se complete realmente.
Ha sido un problema interesante en el que trabajar, espero ver lo que otras personas pueden proponer. Déjame saber en los comentarios si quieres más detalles, y trataré de proporcionarlos.
Hola, estoy trabajando en un problema muy similar y me gustaría saber qué método se utilizó en el final? – jl6