CRC에 대한 더 빠른 대안은 무엇입니까?


27

dsPIC에서 PC로 일부 데이터 전송을 수행하고 있으며 오류가 없는지 확인하기 위해 512 바이트의 모든 블록에 대해 8 비트 CRC를 수행하고 있습니다. 내 CRC 코드를 사용하면 약 33KB / s를 얻지 않고 67KB / s를 얻습니다.

더 빠른 대안 오류 감지 알고리즘은 무엇입니까?


5
CRC 자체는 어떻게 구현됩니까? 비트 단위? 그런 다음 테이블 기반 방법으로 전환하십시오. 바이트 단위? 테이블 크기를 16 비트 (한 번에 2 바이트에서 작동하지만 64KB의 테이블 스토리지가 필요함)로 늘리는 데 필요한 공간, 복잡성 및 시간 상충 관계를 고려하십시오.
Aidan Cully

RAM에는 16KB, ROM에는 128KB 만 있으므로 64KB 테이블은 옵션이 아닙니다.
FigBug

1
256 바이트 테이블을 사용하고 있습니까? 또는 비트 CRC? 비트 단위로 작업하면 바이트 단위 (256 바이트 테이블 사용)가 8 배 빠릅니다.
Aidan Cully

현재 비트 단위로 256 테이블을 시도하겠습니다
FigBug

1
67kb / s ~ 33kb / s? 다른 처리와 관련이 있는지 확실하지 않지만 PIC조차도 약간의 오버 헤드처럼 들립니다. 연주를 방해하는 다른 문제가 있습니까?
Rei Miyasaka

답변:


41

CRC보다 빠른 옵션이있을 수 있지만,이를 사용하면 어느 정도의 오류 감지 기능이 손상 될 수 있습니다. 오류 감지 요구 사항에 따라 응용 프로그램에 최적화 된 CRC 코드를 대신 사용할 수도 있습니다.

CRC와 다른 옵션을 비교하려면 Martin Thompson탁월한 답변을 참조하십시오 .

이것을 돕는 하나의 옵션은 pycrc 입니다. pycrc 는 (파이썬 1로 작성 ) 수십 가지의 crc 모델알고리즘 조합을위한 C 소스 코드 를 생성 할 수 있습니다 . 이를 통해 다양한 조합을 선택하고 벤치마킹하여 자신의 애플리케이션에 맞게 속도와 크기를 최적화 할 수 있습니다. 1 : Python 2.6 이상이 필요합니다.

그것은 지원 crc-8 모델을 뿐만 아니라, 지원 crc-5, crc-16그리고 crc-32다른 사람의 사이에. 에 관해서는 알고리즘 , 그것은 지원 bit-by-bit, bit-by-bit-fasttable-driven.

예를 들어 (아카이브 다운로드) :

$ wget --quiet http://sourceforge.net/projects/pycrc/files/pycrc/pycrc-0.8/pycrc-0.8.tar.gz/download
$ tar -xf pycrc-0.8.tar.gz
$ cd pycrc-0.8
$ ./pycrc.py --model=crc-8 --algorithm=bit-by-bit      --generate c -o crc8-byb.c
$ ./pycrc.py --model=crc-8 --algorithm=bit-by-bit-fast --generate c -o crc8-bybf.c
$ ./pycrc.py --model=crc-8 --algorithm=table-driven    --generate c -o crc8-table.c
$ ./pycrc.py --model=crc-16 --algorithm=table-driven   --generate c -o crc16-table.c
$ wc *.c
   72   256  1790 crc8-byb.c
   54   190  1392 crc8-bybf.c
   66   433  2966 crc8-table.c
  101   515  4094 crc16-table.c
  293  1394 10242 total

256 바이트 룩업 테이블을 사용하여 단일 바이트 룩업 대신 듀얼 니블 룩업 (16 바이트 룩업 테이블 사용)을 사용하여 지정하는 것과 같은 펑키 한 작업을 수행 할 수도 있습니다.

예를 들어 (git 저장소 복제) :

$ git clone http://github.com/tpircher/pycrc.git
$ cd pycrc
$ git branch
* master
$ git describe
v0.8-3-g7a041cd
$ ./pycrc.py --model=crc-8 --algorithm=table-driven --table-idx-width=4 --generate c -o crc8-table4.c
$ wc crc8-table4.c
  53  211 1562 crc8-table4.c

메모리와 속도 제한이 주어지면이 옵션은 속도와 코드 크기 사이에서 최상의 절충안 일 수 있습니다. 확실한 유일한 방법은 벤치마킹하는 것입니다.


pycrc의 자식 저장소에 github에 의 한, 이슈 트래커 , 그러나 또한에서 다운로드 할 수 있습니다 소스 포지 .


나는 PIC를 위해 물건을 쓰는 대부분의 사람들이 C를 사용하고 있다고 생각하지 않지만, 그렇게하면 효과가있을 수 있습니다.
Billy ONeal

4
@ 빌리-정말? 난 C. 사용되지 않은 상업적으로 PIC에 대한 개발 사람 건너했다고 생각하지 않습니다 I를 확실히 요즘 어셈블러에 대한 인내심이 없어 잘 구조화 된 C 꽤 컴팩트 끝낼 수 있습니다.
Mark Booth

dsPIC을 사용하고 있으며 C를 사용하고 있습니다.
FigBug

@FigBug-고마워, 내 대답을 좋아해서 기쁘다. 일부 벤치 마크 테스트를 실행하는 경우 결과로 내 답변을 자유롭게 편집하십시오. 각 알고리즘이 응용 프로그램 처리량 및 메모리 풋 프린트 측면에서 얼마나 큰 차이가 있는지 알고 싶습니다.
Mark Booth

1
pyCrc에 대한 또 다른 투표는 여기입니다. 다른 제약 조건을 가진 다양한 프로젝트에서 사용하면 좋습니다.
Vicky

11

간단한 1 비트 패리티 (기본적으로 데이터 자체를 반복해서 XOR)는 얻을 수있는 속도만큼 빠릅니다. 그래도 CRC의 많은 오류 검사가 손실됩니다.

의사 코드에서 :

char checksum = 0;
for each (char c in buffer)
{
    checksum ^= c;
    SendToPC(c);
}
SendToPc(checksum);

1
나는 얼마 전에 이것을 조사했다. 나는 xor 대신 합산이 실제로 조금 더 잘 작동 한다고 생각 합니다. (일반적으로 모든 것을 합산 한 다음 합계의 2의 보수를 체크섬으로 전송합니다. 수신자에서는 수신 된 체크섬을 포함하여 모든 것을 합산합니다. 결과가 모두 0이면 0이되고 그렇지 않으면 0이
아닙니다

1
@quickly : 나는이 두 가지 사이에 큰 차이가 있다고 생각하지 않습니다. 어떤 방법도 모든 것이 손상되지 않았다는 보장을 제공하지 않습니다. 대상 아키텍처에서 add가 더 빠를 경우에는이를 대신 사용하십시오.
Billy ONeal 1

7
나는 기억했다 : ADD와 XOR의 주요 차이점은 다중 비트 오류의 탐지 가능성이 적다는 것입니다. 바이트 스트림의 경우 동일한 비트 위치의 오류는 XOR을 사용하여 취소됩니다. ADD를 사용할 때 체크섬 바이트를 통한 비트 전파는이 경우가 더 잘 감지됨을 의미합니다. 그러나 바이트 스트림을 통해 확산되는 다른 비트의 다중 비트 오류는 당시 상황에 따라 감지하기 어려울 수 있습니다. 이와 같은 체크섬 배열은 다중 비트 오류의 경우 끔찍하므로 상당히 작은 인수입니다.
quick_now

XOR은 CRC보다 훨씬 덜 유용합니다.

3
@ Thorbjørn : 나는 내 대답에서 그것을 인정했다고 생각합니다. :)
Billy ONeal

10

임베디드 컨텍스트에서 다양한 체크섬과 CRC의 성능을 비교하는 정말 좋은 논문 :

임베디드 네트워크에 대한 체크섬의 효과

발견되지 않은 오류 확률에 대한 연구를 기반으로 결론에서 인용 한 내용은 다음과 같습니다.

버스트 오류가 우세한 경우

XOR, 2의 보수 추가 및 CRC 체크섬은 보수 추가, Fletcher 및 Adler 체크섬보다 더 나은 오류 감지 성능을 제공합니다.

다른 응용 프로그램에서

가능하면“좋은”CRC 다항식을 오류 탐지 목적으로 사용해야합니다.

계산 비용이 매우 제한된 경우

(귀하의 경우와 같이) (효과 순서대로) 사용하십시오.

다른 인용문 :

플레처 체크섬은 애들러 체크섬보다 계산 비용이 낮으며, 일반적인 견해와 달리 대부분의 상황에서 더 효과적입니다.

일반적으로 XOR 체크섬을 새로운 디자인에 사용하는 일반적인 관행을 계속할 이유는 없습니다. 왜냐하면 추가 기반 체크섬과 소프트웨어 계산 비용이 같지만 오류를 탐지하는 데 절반에 불과하기 때문입니다.


1
보너스로 Fletcher 체크섬은 구현하기가 매우 쉽습니다.
RubberDuck

6

애들러 체크섬은 송신 왜곡을 확인하기에 충분해야한다. Zlib 압축 라이브러리에서 사용되며 Java 3D 모바일 그래픽 표준에서 채택되어 빠르고 효과적인 데이터 무결성 검사를 제공합니다.

로부터 위키 피 디아 페이지 :

Adler-32 체크섬은 2 개의 16 비트 체크섬 A와 B를 계산하고 비트를 32 비트 정수로 연결하여 얻습니다. A는 문자열의 모든 바이트의 합에 1을 더한 값이고, B는 각 단계에서 A의 개별 값의 합입니다.

Adler-32 실행이 시작될 때 A는 1로, B는 0으로 초기화됩니다. 합계는 모듈로 65521 (2 ^ 16 또는 65536보다 작은 소수)입니다. 바이트는 네트워크 순서 (빅 엔디안)로 저장되며 B는 가장 중요한 두 바이트를 차지합니다.

함수는 다음과 같이 표현 될 수 있습니다

 A = 1 + D1 + D2 + ... + Dn (mod 65521)
 B = (1 + D1) + (1 + D1 + D2) + ... + (1 + D1 + D2 + ... + Dn) (mod 65521)
   = n×D1 + (n-1)×D2 + (n-2)×D3 + ... + Dn + n (mod 65521)

 Adler-32(D) = B × 65536 + A

여기서 D는 체크섬을 계산할 바이트 문자열이고 n은 D의 길이입니다.


Adler32는 짧은 데이터 실행에는 거의 쓸모가 없습니다. 최대 약 180 바이트로 수많은 충돌이 발생합니다.
greyfade

+1-CRC와 간단한 비트 패리티 사이의 중간 지점.
Billy ONeal

@greyfade-FigBug는 512 바이트 블록을 사용하여 언급 했으므로 OP에는 문제가되지 않습니다. 그래도 다른 요구 사항을 가진 사람들에게 주목하십시오.
Mark Booth

5

CRC만큼 오류 감지에 효과적이며 더 빠르다는 것을 알지 못합니다.있는 경우 사람들이 대신 CRC를 사용합니다.

간단한 체크섬을 시도해 볼 수는 있지만 오류를 감지 할 가능성은 훨씬 낮습니다.


2
나는 속도에 대한 효과를 기꺼이 포기할 것이다.
FigBug

3

체크섬 논리 자체가 좋고 사람들이 더 빠른 알고리즘을 도울 수 있습니다.

구성 요소의 속도를 향상 시키려면 전체 구성 요소를 변경하여 전송 구성 요소를 유효성 검사 구성 요소와 분리해야합니다.

이들을 두 개의 독립된 항목 (다른 스레드에 있음)으로 사용하는 경우 최대 전송 속도를 얻을 수 있으며 실패한 패킷 만 재전송 할 수 있습니다.

알고리즘은 다음과 같습니다.

  • 서버는 알려진 패킷 크기 (1K 청크)로 분류됩니다. "보낼"대기열에 넣습니다.
  • 각 패킷은 16 또는 32 비트 ID와 체크섬으로 전송됩니다.
  • 클라이언트는 각 패킷을 받아서 처리 할 대기열에 넣습니다.
  • 별도의 스레드에서 클라이언트는 한 번에 패킷을 가져와 유효성 검사를 수행합니다.
    • 성공하면 최종 패킷 모음 (ID 순서)에 추가됩니다.
    • 실패하면 실패한 ID를 서버에 다시보고하고, 해당 패킷을 다시 보내도록 재전송합니다.
  • 패킷을 수신하고 유효성을 검사하고 올바른 순서 (1부터 시작)의 ID를 갖게되면 디스크에 기록을 시작하거나 필요한 작업을 수행 할 수 있습니다.

이렇게하면 가능한 최고 속도로 전송이 가능하며 패킷 크기로 플레이하면 옵티 엄 실패율 대 유효성 검사 / 재전송 속도를 계산할 수 있습니다.


2

체크섬은 전통적입니다

(# '+ 스트림 감소)

위에 주어진 XOR도 잘 작동합니다.

(# 'XOR 스트림 감소)

직렬 연결에 대한 표준 패리티 검사는 좀 더 정교하고 느린 구성표입니다.

이 수준에서는 속도에 대한 정확성을 거래하고 있습니다. 이들은 때때로 실패합니다.

다음으로 가장 정교한 수준에서는 crc / hash 유형 항목을 사용할 수 있습니다.

다른 설계는 스트림에 사용되는 블록의 크기를 늘리는 것입니다.

블록 크기에 대한 알고리즘 선택 및 매개 변수를 조정하려면 실제 오류율을 추정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.