2011-03-15 2 views
2

내 응용 프로그램에서 압축을 위해 libLZF을 사용하고 있습니다. 설명서에 나와 관련된 의견이 있습니다.LZF가 다른 알고리즘으로 압축 될 수 있습니다.

lzf_compress might use different algorithms on different systems and 
even different runs, thus might result in different compressed strings 
depending on the phase of the moon or similar factors. 

입력이 동일한 지 비교하기 위해 압축 된 데이터를 비교할 계획입니다. 분명히 다른 알고리즘이 사용되면 압축 된 데이터가 달라집니다. 이 문제에 대한 해결책이 있습니까? 아마도 특정 알고리즘을 매번 강제 실행하는 방법일까요? 아니면이 의견이 실제로 사실이 아닌가? 결국, phase of the moon, or similar factors 조금 이상합니다.

답변

6

"달의 위상 의존성"의 이유는 약간의 성능을 압축하기 위해 일부 데이터 구조의 초기화를 생략하기 때문입니다 (물론 압축 복원 정확도에 영향을주지 않는 경우에만 해당). 흔히 볼 수있는 트릭이 아닙니다. 압축 라이브러리가 있습니다. 따라서 압축 코드를 별도의 원 샷 프로세스에 넣고 OS가 메모리에 프로세스를 넘겨주기 전에 메모리를 0으로 설정하면 (모든 "큰"OS는 그렇지만 작은 OS는 그렇지 않을 수도 있음) 항상 동일한 결과를 얻습니다 압축 결과.

또한, lzfP.h에서, 다음의 주를 가지고 :

/* 
* You may choose to pre-set the hash table (might be faster on some 
* modern cpus and large (>>64k) blocks, and also makes compression 
* deterministic/repeatable when the configuration otherwise is the same). 
*/ 
#ifndef INIT_HTAB 
# define INIT_HTAB 0 
#endif 

그래서 내가 그것을 결정하기 위해 libLZF를 컴파일 할 때 당신은 단지 #define INIT_HTAB 1에 필요가 있다고 생각, 그것에 대한 생각없이 너무 많이 내기 않을 것 추가 분석.

+0

이것은 매우 유망 해 보입니다. – JaredC

+0

몇 가지 연구가 끝나면 필자가 필요로했던 것과 똑같은 것처럼 보입니다. 내가 문서에서 그것을 어떻게 놓쳤는 지 잘 모르지만, 고맙습니다! – JaredC

+0

@ JaredC - 분석 결론을 공유해 주셔서 감사합니다. – atzz

6

즉시 압축을 풀고 비교하십시오.

libLZF의 웹 사이트는 "압축 해제 [...] 기본적으로 (최적화되지 않은) memcpy 속도"라고 말합니다.

+0

이것은 좋은 생각이지만, 나는 즉시 압축을 풀 필요가 없습니다. 여러 가지 이유 때문에 분산 시스템에 통합 되었기 때문에 매우 복잡합니다. – JaredC

+0

압축 부분도 제어하지 않는 한, 같은 입력이 동일한 압축 출력을 생성해야한다고 생각해서는 안된다고 생각합니다. 압축되지 않은 데이터를 압축해야합니다. 목표가 정확히 무엇인지에 따라 압축 전에 (또는 압축 중에) 컨텐츠 체크섬 계산을 요구하고, 별도로 저장하고, 비교에 사용할 수 있습니다. – StaxMan