문제

을 보았다는 것을 몇 가지 질문에 여기에 관련하의 유사성을 결정하는 파일이 있지만 그들은 모두 연결되는 특정 도메인(이미지,사운드,텍스트,etc.).기술로 제공되는 솔루션을 요구하는 지식의 근본적인 파일 형식의 파일을 비교합니다.내가 찾는 방법이 없이 이러한 요건은 임의의 바이너리 파일을 비교할 수 있 필요로하지 않고 이해하는 데이터의 유형은 그들이 포함되어 있습니다.즉,내가 찾는 것을 결정 유사성 비율의 두 파일의'이진 데이터.

게 조금 더 자세히 당신이 일을 위해더라도,이것은 잠재적으로 적용되는 많은 것을 나는 특정한 문제는 나에 노력하고 있습니다.또한 현재 작업 솔루션,하지만 나는 생각하지 않는 것이 이상적입니다.아마 많은 최적화의 관점에서 비교 방법,그리고 저장하기 결과입니다.희망 어떤 사람들은 여기에서 할 수있을 것이 내게 어떤 새로운 아이디어가 있습니다.나는 것입니다 아마 편집에서는 몇 가지 정보에 대해 현재의 내식성을 부부의 일,하지만 나는 원하지 않을 편견에 사람들의 생각에 대한 문제를 방법을 말하고 나는 이미 하고 있습니다.

문제는 나에서 작업입니다 복제지 비디오 게임 ROM 이미지.한이 없는 경험을 에뮬레이션,롬은 덤프의 데이터에서 게임은 카트리지.ROM"복"는 일반적으로 수정 버전 같은 게임의 가장 일반적인 유형되고 번역된 버전입니다.예를 들어,일본어와 영어 버전의 원 최종 판타지 NES 클론이다.게임유의 거의 모든 자산(스프라이트,music,etc.)지만,텍스트는 번역되었습니다.

현재는 여러 그룹에서 작동하는지 나열의 클론에 대해 다양한 시스템,하지만 지금까지 말할 수 있는,이 모든 작업을 수동으로 수행합니다.내가 무엇을 하려고입니다 찾을 수 있는 방법을 검색 유사한 ROM 이미지를 자동으로 그리고 객관적으로,데이터에 기반하는 유사성을 대신에"이런 것 같은 게임".에 대한 몇 가지 이유가 있 감지만,하나의 중요한 동기와 함께 사용할 수 있 솔리드 압축.이렇게 압축의 모든 게임 클론으로 함께 동일 아카이브,전체 압축 복제 설정은 종종 복지만 약간 더보다 공간 중 하나는 개별 Rom.

어떤 관심을 고려할 때까지 오는 잠재적인 접근 방식:

  • Rom 변화에 매우 크기에 따라 시스템입니다.일부 작은,하지만 현대적인 시스템도 큰 사람,256 메가바이트 이상입니다.일(모?) 시스템만이 능력의 2 가능한 크기는 1 백 30 메가바이트에서 게임 중의 하나 이러한 시스템이 있을텐데 256MB rom,주로 비어 있습니다.참고로 이것 때문에,몇 가지 복제할 수 있는 격렬하게 크기가 다른 경우,게임이 십자가 버전이 임계값을 사용하는 카트리지에 두 번의 크기입니다.
  • 현재는 수천 개의 알려진 Rom 많은 시스템에서와 대부분의 시스템은 여전히 새로운 것을 발표했다.심지어 이 시스템은 주요 ROM 커뮤니티는 해킹을 생산하는 수정된 롬을 많습니다.
  • 저장 유사성에 대한 데이터를 가능한 모든 쌍 Rom 결과의 수백만의 행에 대한 데이터의 인기있는 시스템입니다.시스템 5000Rom 필요로 25 만원의 행 유사 데이터,하나의 새로운 게임을 추가하여 5000 행이 있습니다.
  • 의 상태로 처리해야 합 복구할 수 있으므로,이 경우 그것은 중단이 그것을 선택할 수 있습니다.어떤 방법을 많이 처리하는 것이 필요하다고 가정하면 모든 일에서 실행됩니다 하나의 배치가 안전하지 않습니다.
  • 새로운 Rom 추가 할 수 있는 언제든,그래서 방법을해야한다고 가정하지 않는 이미 완료""설정합니다.그 후에도,당신은 이미 알 유사성에 대한 기존의 모든 Rom,는 경우에 새로이 추가됩니다(이것도 발생하기 전에 이전 처리로 완료)방법이 있어야 합를 비교하는 모든 이전의 것들를 확인하는(있다면)그것의 클론입니다.
  • 높은 처리 속도를 제공해야 우선 순위 정확도(점).는지 알 두 Rom94%또는 96%유사한 특별히 중요하지만,경우에 그것은 하루의 처리를 비교하는 새로운 ROM 하는 모든 이전의 것들로 프로그램은 다음을 수행합니다 아마도 결코 진정으로 완료합니다.

그것은 흥미로운 문제 작동하기에,나는 앞으로 무엇을 보고 다른 사람들 수 있습니다.자가 나면 더 많은 정보 및 자료들을 공급하는.

도움이 되었습니까?

해결책

바이너리 델타 또는 이진 델타 (크기와 같은)의 적용에서 파생 된 색인을 원한 것 같습니다. 그런 다음이 색인을 실험적으로 결정하여 "클론"인지 아닌지를 결정하는 일부 기준선과 비교할 수 있습니다.

압축과 델타 생성 사이에는 많은 유사점이 있으므로 현재 구현에 따라 멀지 않다고 말합니다.

즉, 데이터베이스의 모든 이진 파일의 쌍별 비교는 아마도 엄청나게 비싸다 (O (n2), 제 생각에는). 가능한 후보자를 식별하기 위해 간단한 해시를 찾으려고 노력할 것입니다. Spdenne과 Eduard가 제안한 것과 개념적으로 유사한 것. 즉, 모든 항목에 한 번만 적용 할 수있는 해시를 찾아서 그 목록을 정렬 한 다음 해시가 목록에 서로 가까운 항목에 대해 더 미세한 곡물 비교를 사용하십시오.

일반적인 경우에 유용한 해시 구성은 몇 년 동안 CS에서 적극적으로 추구 된 연구 주제였습니다. 그만큼 lshkit 소프트웨어 라이브러리는 이러한 종류의 일부 알고리즘을 구현합니다. 인터넷 접근 가능한 용지 큰 파일 시스템에서 유사한 파일 찾기 텍스트 파일을 비교할 때 더 타겟팅 될 수 있지만 유용 할 수 있습니다. 더 최근의 논문 다중 해상도 유사성 해싱 보다 강력한 알고리즘을 설명합니다. 그러나 구독 없이는 액세스 할 수없는 것으로 보입니다. Wikipedia 기사를 보관하고 싶을 것입니다 지역 민감한 해싱 다른 리소스를 탐색 할 때 편리합니다. 그들은 모두 꽤 기술을 얻었고 Wikipedia 항목 자체는 꽤 수학 무겁습니다. 보다 사용자 친화적 인 대안으로서 분야에서 일부 아이디어 (또는 실행 파일)를 적용 할 수 있습니다. 음향 지문.

일반적인 경우를 포기하려는 경우 ROM에만 적용되는 훨씬 간단하고 빠른 도메인 별 해시 기능을 찾을 수 있습니다. 아마도 표준 또는 공통 바이트 시퀀스의 배치 및 근처의 일부 비트 값과 관련된 것일 수 있습니다. 나는 당신의 이진 형식에 대해 많이 알지 못하지만 사운드, 이미지 또는 텍스트에 대한 영역과 같은 파일의 섹션 시작을 알리는 것들을 상상하고 있습니다. 이진 형식은 파일의 시작 부분 근처에 이러한 종류의 섹션의 주소를 자주 저장합니다. 일부는 또한 첫 번째 섹션의 주소를 크기와 함께 알려진 위치에 저장하는 체인 메커니즘을 사용합니다. 이를 통해 크기 등이 포함 된 다음 섹션으로 이동할 수 있습니다. 약간의 조사는 아마도 아직 인식하지 못한 경우 관련 형식을 발견 할 수 있으며, 건설에 잘 어울릴 것입니다. 유용한 해시.

해시 함수가 당신을 완전히 얻지 못하면 (또는 메트릭/거리를 정의하기 위해 어떤 종류의 입력이 필요하다면) 웹에서 사용할 수있는 여러 바이너리 델타 알고리즘과 구현이 있습니다. 내가 가장 친숙한 것은 Subversion 버전 제어 시스템에서 사용됩니다. Xdelta라는 이진 델타 알고리즘을 사용하여 이진 파일 개정을 효율적으로 저장합니다. 다음은 저장소의 파일에 대한 직접 링크가 있습니다. xdelta.c. 웹에 도구가있을 수 있습니다.

다른 팁

당신은보고 싶을 수도 있습니다 BSDIFF, 이진 차이/패치 시스템입니다. 많은 이론이있는 논문도 있습니다.

몇 가지 아이디어를 사용하십시오 표절 탐지 알고리즘.

내 생각:

각 ROM에 대해 비슷한 "서명"을 만들려면 작은 부분이 변경 될 때 약간 변하고 단어 주파수 그래프와 같은 것을 생성하지만 단어의 주파수를 녹음하는 대신 ROM의 매우 짧은 섹션을 해시 할 수 있습니다. 해시 값의 주파수.

한 섹션을 해시하지 말고 첫 번째 섹션의 끝에서 시작하는 다음 섹션을 해시하지 말고 슬라이딩 창을 사용하여 바이트 1에서 시작하는 섹션을 해시 한 다음 바이트 2에서 시작한 동일한 크기 섹션을 해시 한 다음 바이트에서 해시합니다. 3 등.

각 8 비트 바이트의 XOR과 같은 간단한 해시 기능을 사용한 경우, 다음 창 위치의 해시를 XOR에 의해 전류 해시를 8 비트로 쉽게 계산하고 8 비트를 들어오는 XOR. 또 다른 대안 해시 함수는 단순히 명령어 코드 단어 길이를 사용하는 것일 수 있습니다. 기계 지침을 나타내는 코드의 정적 패턴을 만들기에 충분할 수 있습니다. 중요한 것은 명령 코드에서 일반적인 짧은 시퀀스를 초래하여 동일한 해시 값을 초래하는 해시 함수를 원할 것입니다.

각 주파수가 더 높은 해시 값을 적게 원할 수도 있지만 너무 멀지 않으면 그래프가 너무 평평 해져서 비교하기가 어려워집니다. 마찬가지로 너무 넓어지지 않거나 매우 작은 주파수가 많아서 다시 비교를 어렵게 만듭니다.

ROM 당이 그래프를 저장하십시오. 각 해시 값에 대한 주파수 차이의 제곱 합을 계산하여 두 개의 다른 ROM의 주파수 그래프를 비교하십시오. 그 합이 0으로 합치면 ROM이 동일 할 수 있습니다. 0에서 멀어 질수록 ROM이 덜 비슷할 것입니다.

"며칠"보다 훨씬 많았지 만 현재 솔루션을 여기에 추가해야한다고 생각했습니다.

Nils Pipenbrinck는 내 현재의 방법과 같은 방향으로 가고있었습니다. 클론을 찾는 주요 결과 중 하나는 솔리드 아카이브로 인해 엄청난 비용을 절약하기 때문에 두 개의 롬을 함께 압축하고 얼마나 많은 공간을 절약했는지 볼 수 있다고 생각했습니다. LZMA 알고리즘을 사용하고 있습니다 7zip 이것을 위해.

첫 번째 단계는 모든 ROM을 개별적으로 압축하고 압축 크기를 기록한 다음 두 개의 ROM을 함께 보관하고 결과 크기가 개별 압축 크기와 얼마나 다른지 확인하는 것입니다. 결합 된 크기가 개별 크기의 합과 동일하면 0% 유사하며 크기가 그 중 하나와 동일하면 동일합니다.

이제 이것은 많은 압축 시도가 필요한 수많은 압축 시도이므로 지금까지 몇 가지 최적화가 있습니다 (더 많은 것을 알아 내고 싶습니다).

  1. 압축 크기가 얼마나 유사한 지에 따라 비교 우선 순위를 정합니다. ROM A의 압축 크기가 10MB이고 ROM B가 압축 크기가 2MB 인 경우 20% 이상의 유사한 것이 불가능하므로 실제 결과를 얻기 위해 비교하면 나중에 남을 수 있습니다. 매우 유사한 파일에서 동일한 압축 알고리즘을 실행하면 비슷한 크기의 결과가 발생하는 경향이 있으므로 많은 클론이 매우 빠르게 발견됩니다.

  2. 위와 결합하여 모든 ROM 쌍 사이의 가능한 유사성에 대해 상단 및 하부 "경계"를 모두 유지하십시오. 이것은 추가 우선 순위를 허용합니다. ROM A와 B가 95% 유사하고 ROM B와 C가 2% 유사한 경우 A와 C는 이미 0%에서 7% 사이라는 것을 알고 있습니다. 이것은 복제가 되기에는 너무 낮으므로 모든 것의 정확한 유사성을 알고 싶지 않다면이 비교는 안전하게 연기되거나 완전히 무시 될 수 있습니다.

데이터 압축에서 빌린 일부 기술은 여기서 흥미로울 수 있다고 생각합니다.

A와 B의 두 파일이 있다고 가정합니다.

각 파일을 개별적으로 압축하고 압축 크기를 함께 추가하십시오. 그런 다음 두 파일을 단일의 큰 파일로 연결하고 압축하십시오.

크기의 차이로 인해 파일이 얼마나 유사한 지에 대한 대략적인 추정치가 제공됩니다.

BZIP2 (Burrow Wheeler Transformation)를 사용하여 압축을 시도하는 것이 좋습니다. 대부분의 다른 압축 알고리즘은 이력이 제한되어 있습니다. BWT 알고리즘 OTOH는 매우 큰 데이터 덩어리에서 작동 할 수 있습니다. 알고리즘은 두 파일 모두 동시에 ""를 동시에 보게되며 유사성으로 인해 압축 비율이 높아집니다.

Xdelta는 괜찮은 이진 차이를 얻는 데 매우 유용합니다. http://xdelta.org

당신은 같은 것을 저장하는 것으로 시작할 수 있습니다 해시 나무. 모든 ROM에 대해 그러한 해시 세트 중 하나만 저장하면 필요하며, 필요한 저장 공간은 일정한 블록 크기를 가정 할 때 ROM 크기에 비례하지만 (보다 훨씬 낮음). 선택한 블록 크기는 정확도를 보장하기 위해 충분한 세분성을 제공해야합니다. Tiger-128 해시 (DirectConnect를 통해 전송 된 파일을 확인하는 데 사용하는 것과 유사하게) 1mib의 블록 크기는 잘 작동하며 모든 해시를 128 * 128 / 8 = 2048 바이트에 저장할 수 있습니다! 따라서 10,000 개의 롬을 위해 그것을하는 데 약 20mib의 공간 만 있으면됩니다. 또한 덜 안전하지만 더 빠르고/또는 작은 해시를 선택할 수 있습니다. 유사성 추가/점검 새로운 ROM은 다음과 같은 것을 수반합니다.

  1. 새 ROM을 블록으로 나누고 각각 해시를 해소하십시오.
  2. 이미 데이터베이스의 모든 ROM에 대해 새로운 ROM의 해시와 해시를 비교 (아래 참조).

비교 함수는 유사성을 확인해야합니다. 그러나 각 해시를 불가분의 가치로 취급해야합니다. 즉, 두 해시 사이의 논리적으로 중요한 차이 함수를 찾으려고 노력하지 않습니다. 블록 크기가 충분히 낮고 해시 충돌이 충분히 드물다면, 간단한 IS- 평등 비교로 정확도가 보장됩니다.

보시다시피, 문제는 더 간단한 성능으로 줄어 듭니다. 유사성이 훨씬 작은 데이터 세트를 확인합니다.

두 가지 생각 :

  • 파일을 데이터 흐름 그래프로 구성하고 해당 표현에 대한 정식화를 수행하는 것을 고려하십시오. 지침 세트를 알고 있으므로, 이것은 불가능할 수 있습니다. 아마도 분리기를 묶고 텍스트 처리를 수행 할 수 있습니다.
  • 다음과 같은 훈련 가능한 분류기 CRM114 바이너리가 공통점이 많는지 여부를 알려주는 소형 표현을 제공하는 데 유용 할 수 있습니다.

Waylon Flinn이 말했듯이 바이너리 델타 알고리즘이 필요할 수 있습니다. 그만큼 RSYNC 알고리즘 좋은 것입니다. 빠르고 신뢰할 수 있습니다. 참조 유틸리티의 문서.

어려움이기 때문에 당신과 함께 다루고 있는 실행 가능한 코드,간단한 변화가 전파할 수 있 전체에 걸쳐 ROM.주소하고 오프셋에 대한 모든 값을 변경할 수 있으로 또 하나의 변수로 나 no-op 명령입니다.는 것도록 기반을 해시 쓸모 없습니다.

빠르고 더러운 솔루션을 해킹 솔루션 difflib (또는 해당 w/신의 마음에 드는 언어)때문에,그것은 당신을 얻는 슬라이딩을 비교할 수 있는 거래 데이터를 추가하거나 제거합니다.분 ROM 을 실행 및 데이터 부분(가능한 경우).데이터 섹션에서 비교할 수 있습을 직접 유사성 비율 계산, 지만,당신은 여전히 문제가 있 w/주소 또는 오프셋.

실행 섹션은 더 흥미 롭습니다.에 읽어 기기의 asm 형식을 실행하고으로 분할의 시퀀스를 컴파일러입니다..남 opcode 등록 부분이지만,떨어져 가면"페이로드"/"즉시"부(여기서 그것을 로드하는 변수 addresses).손 결과 정보 유사성 비율 계산기 너무입니다.

불행한 부분은 이것은 여전히 O(n^2)작업의 수에 Rom 당신이 트랙이지만,그들을 완화할 수 있습과(증가)클러스터링이나 주파수 기반의 비교를 줄이기 위해 양을 비교를 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top