Suma kontrolna BSD
Algorytm sumy kontrolnej BSD był powszechnie używanym, starszym algorytmem sumy kontrolnej . Został zaimplementowany w starym BSD i jest również dostępny za pośrednictwem narzędzia wiersza poleceń sum .
Ten algorytm jest bezużyteczny z punktu widzenia bezpieczeństwa i jest słabszy niż CRC-32 cksum do wykrywania błędów.
Obliczanie sumy kontrolnej BSD
Poniżej znajduje się odpowiednia część sumy kodu źródłowego GNU ( na licencji GPL ). Oblicza 16-bitową sumę kontrolną, dodając wszystkie bajty (8-bitowe słowa) wejściowego strumienia danych. Aby uniknąć wielu słabości zwykłego dodawania danych, akumulator sumy kontrolnej jest obracany w prawo o jeden bit na każdym kroku przed dodaniem nowego znaku.
0
int bsdChecksumFromFile ( PLIK * fp ) /* Uchwyt pliku dla danych wejściowych */ { int suma kontrolna = ; /* Modyfikacja sumy kontrolnej 2^16. */ for ( int ch = getc ( fp ); ch != EOF ; ch = getc ( fp )) { suma kontrolna = ( suma kontrolna >> 1 ) + (( suma kontrolna & 1 ) << 15 ); suma kontrolna += kan ; suma kontrolna &= 0xffff ; /* Trzymaj to w granicach. */ } zwróć sumę kontrolną ; }
Opis algorytmu
Jak wspomniano powyżej, ten algorytm oblicza sumę kontrolną, dzieląc dane na segmenty i dodając je do akumulatora, który jest kołowo przesunięty w prawo między każdym sumowaniem. Aby utrzymać akumulator w granicach wartości zwracanej, wykonywane jest maskowanie bitów za pomocą jedynek.
Przykład: Obliczanie 4-bitowej sumy kontrolnej przy użyciu segmentów o rozmiarze 4-bitowym ( big-endian )
Wejście: 101110001110 -> trzy segmenty: 1011, 1000, 1110.
Iteracja 1:
segment: 1011 suma kontrolna: 0000 maska bitowa: 1111
a) Zastosuj przesunięcie kołowe do sumy kontrolnej:
0000 -> 0000
b) Dodaj sumę kontrolną i segment, nałóż maskę bitową na otrzymany wynik:
0000 + 1011 = 1011 -> 1011 i 1111 = 1011
Iteracja 2:
segment: 1000 suma kontrolna: 1011 maska bitowa: 1111
a) Zastosuj przesunięcie kołowe do sumy kontrolnej:
1011 -> 1101
b) Dodaj sumę kontrolną i segment, nałóż maskę bitową na otrzymany wynik:
1101 + 1000 = 10101 -> 10101 i 1111 = 0101
Iteracja 3:
segment: 1110 suma kontrolna: 0101 maska bitowa: 1111
a) Zastosuj przesunięcie kołowe do sumy kontrolnej:
0101 -> 1010
b) Dodaj sumę kontrolną i segment, nałóż maskę bitową na otrzymany wynik:
1010 + 1110 = 11000 -> 11000 i 1111 = 1000
Końcowa suma kontrolna: 1000
Źródła
- oficjalny sumaryczny kod źródłowy FreeBSD
- oficjalna strona podręcznika GNU sum
- Suma kodu źródłowego GNU