Samoopravne algoritmy (Self Repair, Recovery)

(Self Repair Mechanism, Codes, Recovery, self-correcting, Teorie kodovani)

  1. Vysvetleni a informace
  2. Kontrolni soucty
  3. Samoopravne kody
  4. funkce XOR

Top

Kontrolni soucty (Check summary, CheckSum)

Paritni bit (Parity bit)

	Kontrola, zda je pocet stejnych bitu sudy nebo lichy.

	111010010011 -- 11 (not inp = 000101101100) <0-1>
	a) funkce SUMA
	   a + b + c ... = 1+1+1+0+1+0+0+1+0+0+1+1 = 7 and 1 = 1 (lichy pocet jednicek v inp)
	   a + b + c ... = 0+0+0+1+0+1+1+0+1+1+0+0 = 5 and 1 = 1 (lichy pocet nul v inp)
	b) funkce XOR
	   a xor b xor c ... (111010010011) = 1 (lichy pocet jednicek v inp)
	   a xor b xor c ... (000101101100 = not inp) = 1 (lichy pocet nul v inp)

Parita byte (Parity byte)

	211 22 3 45 0 67 92 -- 184 <0-255>
	Suma = 211+22+3+45+0+67+92 = 440 and 255 = 184

Soucet bytu (Suma bytes)

	211 22 3 45 0 67 92 -- 184 <0-255>
	Suma = 211+22+3+45+0+67+92 = 440

XOR bytu
	211 22 3 45 0 67 92 -- 244 <0-255>

	11010011
	00010110
	00000011
	00101101
	00000000
	01000011
	01011100
	--------
	11110100 = 244 (Kdyz je pocet jednicek ve sloupci lichy, vysledek je 1)
	Nevyhodou je, ze staci 2 chyby na te same pozici se vyrusi, xor je neukaze.

Soucty souctu, parit

	111010010011 -- 0
	...1...0...1 parita(parita(4-bit block)) = 0
	
	211 22 3 45 0 67 92 0 -- 184
	   233	 48   67   92 = suma(suma 2 byte block) = 184

MD2-MD6, SHA0-SHA3 (Keccak) hash (MD Message Digest, SHA Secure Hash Algorithm)

	Jsou to slozitejsi blokove kontrolni soucty.

	MD5 (cast algoritmu)
	 0 ≤ i ≤ 15: F = (B and C) or ((not B) and D)
	16 ≤ i ≤ 31: F = (D and B) or ((not D) and C)
	32 ≤ i ≤ 47: F = B xor C xor D
	48 ≤ i ≤ 63: F = C xor (B or (not D))

	SHA1 (cast algoritmu)
         0 ≤ i ≤ 19: f = (b and c) or ((not b) and d)
        20 ≤ i ≤ 39: f = b xor c xor d
        40 ≤ i ≤ 59: f = (b and c) or (b and d) or (c and d) 
        60 ≤ i ≤ 79: f = b xor c xor d

CRC hash (Cyclic redundancy check)

	Udajne se da CRC pouzit i k oprave chyb.

	Matematicky: Sčítání polynomů v konečném tělese GF(2^n)
	      A = 100101 = 1*x^5 + 1*x^2 + 1*x^0 = x^5 + x^2 + 1
	      B = 110011 = x^5 + x^4 + x + 1
	A xor B = 010110 = x^4 + x^2 + x = C
	A + B   = (x^5 + x^2 + 1) + (x^5 + x^4 + x + 1) = 2x^5 + x^4 + x^2 + x + 2
	        = vse dvojnasobne se vyrusi = x^4 + x^2 + x = C

	Delitel (polynom) je zvolene cislo. Pro 16-bit je dobry 8D95, 1000110110010101. Melo by asi
	obsahovat co nejvic stridani 0 a 1. Navic, muzeme vygenerovat tabulku a pri kazde rotaci
	pouzit jiny polynom.
	Pred Input dame jednicku. Za input nulove bity podle delky delitele (o jeden mene, 4-1=3).
	A pak postupne xorujeme a rotujeme delitel, dokud neni prvni cast nulova (bez poslednich
	3 bitu). Ty jsou pak CRC hash. Cim vetsi je delitel, tim je vetsi pravdepodobnost, ze jsou
	data neporusena, ale neni to 100%.
	11010011101100 000 <--- input (14 bit) + 3 nulove bity (3 = 4 (delitel) - 1)
	1011               <--- delitel (4 bity) = 1101 = polynom x^3 + x + 1 (4 bit = CRC-3)
	01100011101100 000 <--- vysledek
	 1011              <--- delitel, posun/rotace doprava
	00111011101100 000
	  1011
	00010111101100 000
	   1011
	00000001101100 000 <--- delitel, posun se az k jednicce
	       1011
	00000000110100 000
	        1011
	00000000011000 000
	         1011
	00000000001110 000
	          1011
	00000000000101 000
	           101 1
	------------------
	00000000000000 100 <--- prvni cast je 0, konec, posledni 3 bity jsou CRC hash.

	crc_remainder('11010011101100', '1011', '0')   = '100'
	crc_check(    '11010011101100', '1011', '100') = True

Blake3, Blake2 (in rar5)

	https://en.wikipedia.org/wiki/BLAKE_(hash_function)

	BLAKE
	j = sigma_table[r%10][2*i]                // Index computations (i = data index = 0..n)
	k = sigma_table[r%10][2*i+1]
	a = a + b + (message[j] xor n_const[k])   // Step 1 (with input)
	d = (d xor a) >>> 16
	c = c + d                                 // Step 2 (no input)
	b = (b xor c) >>> 12
	a = a + b + (message[k] xor n_const[j])   // Step 3 (with input)
	d = (d xor a) >>> 8
	c = c + d                                 // Step 4 (no input)
	b = (b xor c) >>> 7

Fletcher4 (1970, in ZFS)

	Slabina: Kdyz jsou data binarne 00000000 nebo 11111111, tak je povazuje za stejne.

	Fletcher
	A = 0, B = 0
	A += Data[i]
	B += A
	base8 = value mod 256
	Output = base8(A), base8(B)

	Fletcher example
	i Data  A    B
	-  -     0    0
	1 163  163  163
	2 200  363  526
	3  19  382  908
	4  74  456 1364
	5  88  544 1908
	Output = base8(544), base8(1908) = 34, 123

	Fletcher4
	A = 0, B = 0, C = 0, D = 0
	A += Data[i]
	B += A
	C += B
	D += C
	base8 = value mod 256
	Output = base8(A), base8(B), base8(C), base8(D)

	Fletcher ASM
	.sloop
	vpmovzxdq  data, [buf]	; loads DWORD data into QWORD lanes
	add	   buf, 16
	vpaddq	   a, a, data
	vpaddq	   b, b, a
	vpaddq	   c, c, b
	vpaddq	   d, d, c
	cmp	   buf, end
	jb	   .sloop


Adler-32 CheckSum (1995, in zlib)

	D = Wikipedia = 87 105 107 105 112 101 100 105 97
	MOD_ADLER = 65521 // for 16-bit checksum
	A0 = 1
	B0 = 0
	A1 = 1 + D1 = 1 + 87 = 88 // An = ( A(n-1) + D(n) ) % MOD_ADLER; ('W')
	B1 = 0 + A1 = 0 + 88 = 88 // Bn = ( suma(B(n-1)) + A(n) ) % MOD_ADLER;
	A2 = 88 + 105 = 193 ('i')
	B2 = 88 + 193 = 281
	A2 = 193 + 107 = 300 ('k')
	B2 = 281 + 300 = 581
	...
	An = 823 + 97 = 920 ('a')
	Bn = 3662 + 920 = 4582
	base16 = value mod 65536
	Output = base16(4582), base16(920) = 0x11E6, 0x398

Zedmee 
	https://github.com/matteo65/ZedmeeHash
	h = table[(--length + data[pos + length]) & 0xFF] xor ((h << 2) + h);

Dalsi funkce
	Arash Partow
	Bernstein
	FNV-1a
	Hanson
	iSCSI CRC
	K&R
	Larson
	lookup3
	MaPrime2c
	Meiyan
	Murmur2
	Murmur2A
	Murmur3
	Novak unrolled
	One At Time
	Paul Hsieh
	Ramakrishna
	RIPEMD
	SBox
	Sedgewick
	SHAKE128
	TIGER
	Weinberger
	Whirlpool (AES)
	x17 unrolled
	x65599
	XXHfast32
	XXHstrong32

	https://www.strchr.com/hash_functions
Top

Samoopravne kody

RAID Parity (XOR)
	funkce XOR
	abc|d   d = a xor b xor c
	000|0   c = d xor a xor b
	001|1   b = c xor d xor a
	010|1   a = b xor c xor d
	011|0                    
	100|1                    
	101|0                    
	110|0                    
	111|1                    
	
	Mame 3 casti disku A, B, C. K nim vytvorime 4tou cast D pomoci funkce XOR.
	
	101101 A -- disk 1 (data)
	001011 B -- disk 2 (data)
	100100 C -- disk 3 (data)
	--------
	000010 D = A XOR B XOR C -- disk 4 (opravny disk, recovery data)
	
	Pokud pomoci CheckSum zjistime, ze je nejaky disk vadny, tak jej lze cely dopocitat pomoci
	recodery disku pomoci funkce XOR.

	Obnova disku B pomoci A, C a D
	101101 A
	100100 C
	000010 D
	--------
	001011 B = A XOR D XOR C

	Muzete disk rozdelit na 6 casti a ulozit si xor pro 3 a 3 casti a pak pro nahodne 4 ze vsech 6.

Hammingův kód (1950, flash disk USB)
	Pozn.: Sorry, strasne slozity mat. vyklad.
	https://cs.wikipedia.org/wiki/Hamming%C5%AFv_k%C3%B3d#Hamming%C5%AFv_k%C3%B3d_(7,4)

	Pro 4 bity abcd
	P xor a xor b xor c = 0
	Q xor a xor b xor d = 0
	R xor d xor b xor c = 0

	JS kod pro kodovani
	function hammingEncode(input) {
		if (typeof input !== 'string' || input.match(/[^10]/)) {
			return console.error('hamming-code error: input should be binary string,
			         for example "101010"');
        	}
		var output = input;
		var controlBitsIndexes = [];
		var controlBits = [];
		var l = input.length;
		var i = 1;
        	var key, j, arr, temp, check;
		while (l / i >= 1) {
			controlBitsIndexes.push(i);
			i *= 2;
        	}
		for (j = 0; j < controlBitsIndexes.length; j++) {
			key = controlBitsIndexes[j];
			arr = output.slice(key - 1).split('');
			temp = chunk(arr, key);
			check = (temp.reduce(function (prev, next, index) {
				if (!(index % 2)) {
					prev = prev.concat(next);
				}
				return prev;
			}, []).reduce(function (prev, next) { return +prev + +next },
				0) % 2) ? 1 : 0;
			output = output.slice(0, key - 1) + check + output.slice(key - 1);
			if (j + 1 === controlBitsIndexes.length && output.length / (key * 2) >= 1) {
				controlBitsIndexes.push(key * 2);
			}
        	}
	return output;
	}
Reedovy–Solomonovy kódy (CD disky)
	Pozn.: Sorry, strasne slozity mat. vyklad s furierovou transformaci.
	https://cs.wikipedia.org/wiki/Reedovy%E2%80%93Solomonovy_k%C3%B3dy - odkazuji na BCH
	https://cs.wikipedia.org/wiki/BCH_k%C3%B3d

Opakovací kód
	Bity se vysilaji 3x, 2 ze 3 shodnych se povazuji za spravne.

	000 0 (00x)
	001 0 (00x)
	010 0 (00x)
	011 1 (11x)
	100 0 (00x)
	101 1 (11x)
	110 1 (11x)
	111 1 (11x)

	Protoze chyby vetsinou poskodi nekolik bitu po sobe je vyhodnejsi rozdelit zpravu na bloky
	a ty zopakovat 3x za sebou.

Oprava sumem
	Mame 2 prenasene kanaly. Jednim posilame data, druhy ma predem urceny signal. Pokud vznikne
	sum (radiove ruseni) na dratu, predpoklada se, ze narusi oba kanaly stejne. Z druheho kanalu
	muzeme vyrobit sum, ktery odecteme od prvniho kanalu a ziskame mozn neposkozena data.

Seznam samoopravných kódů

	AN kódy
	BCH kód, který lze navrhnout tak, aby opravoval libovolný počet chyb v kódovém bloku
	Barkerův kód používán pro radary, telemetrii, ultrazvuk, Wifi, sítě mobilní telefonů DSSS, GPS
	Bergerův kód
	Kód s konstantní váhou
	Konvoluční kód
	Expanderové kódy
	Skupinové kódy
	Golayovy kódy, z nichž Binární Golayův kód má praktický význam
	Goppův kód používaný v McEliecově kryptosystému
	Hadamardův kód
	Hagelbargerův kód
	Hammingův kód
	Kód vycházející z latinského čtverce pro nebílý šum (převládající například při
	 vysokorychlostních přenosech po napájecích vodičích)
	Lexikografický kód
	Lineární síťové kódování typ výmazového opravného kódu přes síť místo dvoubodové spoje
	Dlouhý kód
	Nízkohustotní kód s kontrolou parity, také známý jako Gallagerův kód, jako archetyp řídkých
	 grafových kódů
	LT kód je téměř optimální Fountainův kód
	Kód m z n
	Nordstromův-Robinsonův kód, používaný v geometrii a teorii grup[24]
	Online kód, téměř optimální Fountainův kód
	Polární kód (teorie kódování)
	Raptor kód, téměř optimální Fountainův kód
	Reedovy–Solomonovy kódy
	Reedův–Mullerův kód
	Opakovat-accumulate kód
	Opakovací kódy, např. trojnásobná modulární redundance
	Spinální kód, bezpoměrový, nelineární kód založený na pseudonáhodných hashovacích funkcích
	Tornado kód, téměř optimální výmazový kód, předchůdce Fountainových kódů
	Turbokód
	Walshův–Hadamardův kód
	Cyklický redundantní součet (CRCs)
	Viterbiho algoritmus
	Dopředná oprava chyb (FEC)
	LDPC (parita)
Top

Vysvetleni a informace

-

Top

funkce XOR

	abcd|e   e = a xor b xor c xor d
	0000|0
	0001|1     abc|d   d = a xor b xor c
	0010|1     000|0   c = d xor a xor b
	0011|0     001|1   b = c xor d xor a
	0100|1     010|1   a = b xor c xor d
	0101|0     011|0
	0110|0     100|1
	0111|1     101|0
	1000|1     110|0
	1001|0     111|1
	1010|0
	1011|1     ab|c    c = a xor b
	1100|0     00|0    b = c xor a
	1101|1     01|1    a = b xor c
	1110|1     10|1
	1111|0     11|0

	Xor ma na vystupu jednicku, kdyz je pocet jednicek vstupu lichy.
	https://web.stanford.edu/class/cs103/tools/truth-table-tool/

	Zajimave vlastnosti
	a xor b = b xor a
	(a xor b) xor c = a xor (b xor c)
	a xor b xor b = a
	b xor a xor a = b
	a xor a = 0
	a xor 0 = a
Top