Fletcher 체크섬에 대한 Wikipedia 기사 (현재)에 따르면 Fletcher 32의 경우 360 단계 후에 합계를 줄여야합니다 . 그러나 내 테스트에 따르면 720 단계 후에는 충분합니다. Wikipedia의 360 제한이 단순히 잘못되었거나 테스트에서 실수를 했습니까?
다른 가능한 최적화에 대한 보너스 포인트 :-) 제한을 하드 코딩하는 경우를 제외하고.
내 테스트 케이스 (Java, C 또는 C #에도 동일하게 적용됨) :
public static void main(String... args) {
byte[] data = new byte[2 * 1024];
Arrays.fill(data, (byte) 255);
for (int limit = 1; limit <= 721; limit++) {
System.out.println("Test limit " + limit);
for (int i = 0; i < data.length; i += 2) {
if (getFletcher32(data, i, 1) != getFletcher32(data, i, limit)) {
System.out.println("Stop at limit=" + limit + " index=" + i);
return;
}
}
}
}
// bytes: the data
// length: the number of bytes (must be an even number)
// limit: when to reduce the sums (only used for testing)
static int getFletcher32(byte[] bytes, int length, int limit) {
int s1 = 0xffff, s2 = 0xffff;
for (int i = 0; i < length;) {
for (int end = Math.min(i + limit, length); i < end;) {
int x = ((bytes[i++] & 0xff) << 8) | (bytes[i++] & 0xff);
s2 += s1 += x;
}
s1 = (s1 & 0xffff) + (s1 >>> 16);
s2 = (s2 & 0xffff) + (s2 >>> 16);
}
s1 = (s1 & 0xffff) + (s1 >>> 16);
s2 = (s2 & 0xffff) + (s2 >>> 16);
return (s2 << 16) | s1;
}
테스트 결과 :
Test limit 1
Test limit 2
...
Test limit 720
Test limit 721
Stop at limit=721 index=721
결과는 제한 1에서 최대 720까지 동일하며 제한 721에서만 체크섬이 다릅니다 (잘못된 의미).
이제 내 실수를 깨달았고 Wikipedia 와 내 구현이 모두 올바른지 확인했습니다.
그 이유는 Wikipedia 기사에서는 360 단어 (각 단어 2 바이트)의 제한을 사용하는 반면 내 구현은 720 바이트 제한을 사용하기 때문 입니다.
최적화에 관해서 : 아마도 최종 감소 단계가 약간 단순화 될 수 있지만 그다지 변하지 않을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다