Questa è la bellezza di algoritmo di checksum: che il modo in cui si produce il checksum e il modo in cui si controlla è in qualche modo simmetrica!
- chi checksum
checksum è tipicamente utilizzato per verificare l'integrità dei dati, specialmente su canale di comunicazione rumoroso/unrealiable. Pertanto, viene utilizzato principalmente per il rilevamento degli errori . Cioè, per sapere se i dati ricevuti sono corretti o non.
Questo è abbastanza diverso con, ad esempio, la correzione degli errori . Dal momento che il suo utilizzo è non solo per verificare se vi è errore, ma anche per correggerlo, in genere i dati con correzione dell'errore overhead cresce in dimensioni piuttosto proporzionalmente con i suoi dati originali (poiché più dati hai, più sovraccarico è necessario ripristinarlo).
Così, in questo senso un algoritmo di checksum buona è tipicamente quella che utilizza la quantità minima dei dati di overhead per rilevare l'errore ma con grande robustezza verso risultato falso.
E con ciò la comprensione del problema risiede, dal momento che la robustezza del checksum in realtà, non solo dipende dalla algoritmo, ma anche dipende dalle canale caratteristiche. Alcuni canali possono essere soggetti a determinati tipi di errore mentre gli altri canali sono altri. In generale, ci sono alcuni checksum che sono noti per essere più robusti e più popolari degli altri (uno dei miei preferiti è CRC - Cyclic Redundancy Check). Ma non esiste un checksum perfetto per ogni scenario, in realtà dipende dall'utilizzo e dallo scenario.
Ma ancora, è possibile misurare robustness di un algoritmo di checksum. E c'è un modo matematico per farlo, che penso sia oltre lo scopo di questa discussione.Pertanto, alcuni checksum, in questi sensi, possono essere considerati più deboli degli altri. I checksum che hai mostrato nella tua domanda sono anche quelli deboli.
- Informazioni sul codice
XOR con 0xFF per 8-bit è perfettamente equivalente con binario invertente un valore, e non è troppo difficile da vedere .
XOR con 0xFF
1110 0010
1111 1111
--------- XOR
0001 1101 //notice that this is exactly the same as binary inverting!
Così, quando si fanno XOR con 0xFF e ~checksum
, si ottiene lo stesso risultato -71 (e dal momento che il tipo di dati è char
, ha numero negativo). Quindi lo incrementa di 1, quindi ottieni -70.
- circa 2' Complemento complemento
Two è un'operazione matematica su numeri binari, così come un binario con segno rappresentazione dei numeri in base a questa operazione. Il suo ampio utilizzo in informatica lo rende l'esempio più importante di un complemento di radix. (wikipedia)
In altre parole, 2' complementare è quello di trovare la rappresentazione negativo di un valore (in Computer binario) e il suo metodo è, come avete fatto correttamente, invertendo tutti i bit e quindi aggiungere uno a esso. Ecco perché ottieni -70 per 2 'completando 70. Ma questo è non significa che 2 'complemento e XOR di 0xFF è lo stesso, e come puoi vedere dall'esempio, non è proprio lo stesso.
Ciò che XOR by 0xFF fa nei dati a 8 bit è semplicemente equivalente a invertire tutti i suoi bit. Non ne aggiunge uno.
- Circa il modo di leggere aggiungere/leggere checksum
Dal momento che la somma di controllo viene utilizzato per conoscere il dell'integrità dei dati (se si è alterato o non), le persone cercano di trovare le migliori pratiche per farlo. Quello che fai è in realtà di ottenere il checksum per 2 'complementare o da XOR con 0xFF.
E questi sono ciò che fanno:
- 2' completano checksum. Diciamo che la lunghezza del tuo messaggio è N. Poiché ciò che ottieni sommando i numeri N sono, diciamo, 70. Quindi aggiungendo il checksum di 2'completo (ovvero -70), Nel ricevitore, devi semplicemente sommare tutti i messaggi N + 1 incluso il checksum e si dovrebbe ottenere 0 se il messaggio è inalterato. Ecco come usare correttamente il checksum del complemento 2 '.
- Per XOR con 0xFF Ancora, con lo stesso esempio del precedente, si dovrebbe ottenere -1 se si sommano tutti i messaggi N + 1, compreso il checksum.E dal momento che la rappresentazione esadecimale di -1 è 0xFF a 8-bit con segno, in tal modo dal XOR ing risultato (-1) con 0xFF, si dovrebbe ottenere 0xFF^0xFF = 0 se il messaggio contiene nessun errore
Quindi, in entrambi i casi, è sufficiente verificare se il messaggio contiene errori o meno controllando se il risultato finale è 0 (nessun errore) o no !! E questo è tipicamente vero per gli algoritmi di checksum!
Questa è la bellezza di algoritmo di checksum: che il modo in cui si produce il checksum e il modo in cui si controlla è in qualche modo simmetrica!
Questo è un valore molto basso. Due file casuali avranno lo stesso checksum con probabilità 1/256. Questo è piuttosto inutile per le applicazioni pratiche. –
@ n.m. Grazie per il commento. Puoi aggiungere una risposta e spiegarmi il checksum? – highlander141
Si consideri una situazione, il mittente invia per esempio un file, con checksum a chiunque. Durante l'invio ci sarà un errore, quindi un bit è cambiato. Il ricevitore riceverà il file danneggiato, quindi calcolerà il checksum con lo stesso algoritmo del mittente e confronterà con il checksum del ricevente. Sarà diverso quindi saprà che questo messaggio è danneggiato in modo che il ricevente possa chiedere al mittente di inviare nuovamente il file. – maskacovnik