Κώδικες Διόρθωσης Σφαλμάτων (Error-Correcting Codes) Σφάλματα που αυτο- διορθώνονται…
JOHN LOCKE, Δοκίμιο για την Ανθρώπινη Κατανόηση (1690) 1632 - 1704 Είναι άλλο πράγμα να δείξεις σε κάποιον ότι κάνει λάθος και άλλο πράγμα να τον κάνεις να αντιληφθεί την αλήθεια… JOHN LOCKE, Δοκίμιο για την Ανθρώπινη Κατανόηση (1690)
Πώς ξεκίνησε η ιστορία… Σήμερα, έχουμε πρόσβαση σε υπολογιστή όποτε το θελήσουμε… Ο Richard Hamming, ερευνητής στα εργαστήρια της τηλεφωνικής εταιρείας Bell τη δεκαετία του 1940, δεν ήταν τόσο τυχερός: ο υπολογιστής της εταιρείας που χρειαζόταν χρησιμοποιούταν και από άλλα τμήματα της εταιρείας και ο ίδιος μπορούσε να τον χρησιμοποιεί μόνο τα ΣΚ… Ο υπολογιστής συχνά «κόλλαγε» λόγω λαθών κατά την ανάγνωση δικών του δεδομένων… Φανταστείτε τι πρόβλημα αντιμετώπιζε ο Hamming…
Πώς ξεκίνησε η ιστορία… @Bell Labs Bell Labs Murray Hill, USA
Πώς ξεκίνησε η ιστορία… Ο ίδιος ο Hamming έλεγε: Για δύο συνεχόμενα ΣΚ ήρθα στο γραφείο και βρήκα τον υπολογιστή κολλημένο και όλη μου τη δουλειά να μην έχει προχωρήσει. Ενοχλήθηκα τρομερά γιατί χρειαζόμουν τα αποτελέσματα των πειραμάτων που έτρεχα και δύο ΣΚ είχαν πάει χαμένα.... Είπα, “Τι στο καλό; Αν το μηχάνημα μπορεί να ανιχνεύσει ένα σφάλμα, γιατί να μη μπορεί να εντοπίσει τη θέση του σφάλματος και να το διορθώσει;” Όπως και σε άλλες περιπτώσεις, τελικά η ανάγκη είναι η κινητήρια δύναμη πίσω από κάθε εφεύρεση ο Hamming σύντομα δημιούργησε τον πρώτο κώδικα διόρθωσης σφαλμάτων: έναν μαγικό αλγόριθμο που ανίχνευε και διόρθωνε σφάλματα σε δεδομένα υπολογιστή... Χωρίς τέτοιους κώδικες, οι υπολογιστές μας και τα συστήματα επικοινωνίας θα ήταν εξαιρετικά πιο αργά, λιγότερο ισχυρά και λιγότερο αξιόπιστα από ό,τι είναι σήμερα…
Τι εργασίες εκτελεί ένας υπολογιστής; Οι υπολογιστές εκτελούν 3 θεμελιώδεις εργασίες: Η πιο σημαντική εργασία είναι η εκτέλεση υπολογισμών: δηλ., ο υπολογιστής πρέπει να μετατρέψει κάποια δεδομένα εισόδου με κάποιον τρόπο ώστε να παράγει μια χρήσιμη απάντηση Η δυνατότητα του υπολογιστή να παράγει απαντήσεις θα ήταν στην ουσία άχρηστη χωρίς άλλες 2 σημαντικές εργασίες που εκτελούν οι υπολογιστές: την αποθήκευση και τη μετάδοση δεδομένων οι υπολογιστές αποθηκεύουν δεδομένα κυρίως στο σκληρό δίσκο, στη μνήμη τους και στις άλλες μονάδες δίσκων ενώ συνήθως μεταδίδουν δεδομένα στο internet φανταστείτε έναν υπολογιστή που δεν θα μπορούσε να αποθηκεύει ούτε να μεταδίδει πληροφορία: θα ήταν σχεδόν άχρηστος θα μπορούσαμε να εκτελέσουμε κάποιους πολύπλοκους υπολογισμούς (όπως π.χ., να ετοιμάσουμε μια λογιστική κατάσταση για τον προϋπολογισμό μιας εταιρείας) αλλά δεν θα μπορούσαμε να στείλουμε τα αποτελέσματα σε συναδέλφους ούτε να τα αποθηκεύσουμε για μεταγενέστερη χρήση… η μετάδοση και αποθήκευση δεδομένων είναι και οι δύο πραγματικά ουσιώδεις για τους σύγχρονους υπολογιστές
Γιατί χρειάζεται η ανίχνευση σφαλμάτων και η διόρθωσή τους; Η μεγάλη πρόκληση σχετικά με τη μετάδοση και αποθήκευση δεδομένων είναι ότι τα δεδομένα πρέπει να είναι ολόσωστα αφού σε πολλές περιπτώσεις ακόμα κι ένα πολύ μικρό λάθος μπορεί να καταστήσει τα δεδομένα άχρηστα… Σαν άτομα, είμαστε εξοικειωμένοι με την ανάγκη αποθήκευσης και μετάδοσης δεδομένων χωρίς σφάλματα: Αν σημειώσουμε κάποιον αριθμό τηλεφώνου, είναι ουσιώδες κάθε ψηφίο του αριθμού να είναι γραμμένο σωστά και να έχει καταγραφεί με τη σωστή σειρά. Ακόμα κι ένα λάθος σε ένα μόνο ψηφίο, κάνει τον αριθμό άχρηστο (και για εμάς και για άλλους) Μπορεί λάθη στα δεδομένα να κάνουν τα δεδομένα κάτι χειρότερο από άχρηστα: ένα λάθος σε κάποιο αρχείο που περιέχει ένα πρόγραμμα μπορεί να κάνει το πρόγραμμα να «κολλάει» ή ακόμα και να το κάνει να εκτελεί άσχετες εργασίες: ένα λάθος σε οικονομικά αρχεία θα μπορούσε να προκαλέσει μεγάλες χρηματικές απώλειες (να αγοράζει κανείς μετοχές αξίας $5.34 με τιμή $8.34 από λάθος!!!!) Αλλά το ποσό πληροφορίας που καλούμαστε εμείς να αποθηκεύουμε είναι σχετικά μικρό, και επίσης μικρό είναι και το ποσό πληροφορίας που πρέπει να αποθηκεύουμε χωρίς λάθη, και δεν είναι δύσκολο να αποφεύγουμε τα λάθη αν προσέχουμε εξαιρετικά όταν πρόκειται για σημαντική πληροφορία όπως τραπεζικοί λογαριασμοί, passwords, διευθύνσεις e-mail, κτλ…
Γιατί χρειάζεται η ανίχνευση σφαλμάτων και η διόρθωσή τους; Αντίθετα, το ποσό πληροφορίας που πρέπει οι υπολογιστές να αποθηκεύσουν και να μεταδώσουν χωρίς λάθη είναι τεράστιο… Υποθέστε ότι έχουμε ένα υπολογιστικό σύστημα με δυνατότητα αποθήκευσης 100 gigabytes (π.χ., ένα σχετικά φθηνό laptop) τα οποία ισοδυναμούν με περίπου 15 εκατομμύρια σελίδες κειμένου. Ακόμα κι αν ο υπολογιστής κάνει μόνον 1 λάθος ανά 1.000.000 σελίδες κειμένου θα υπήρχαν (κατά μέσο όρο) 15 σφάλματα όταν θα «γέμιζε» ο υπολογιστής… Το ίδιο ισχύει και για μεταδόσεις δεδομένων: αν κατεβάσουμε ένα πρόγραμμα των 20 megabytes και ο υπολογιστής λαμβάνει λάθος μόνον 1 / 1 εκατομ. χαρακτήρες, θα υπάρχουν πιθανώς περισσότερα από 20 λάθη στο πρόγραμμα που κατεβάσαμε και καθένα θα μπορούσε να κάνει το πρόγραμμα να δυσλειτουργήσει ακόμα κι όταν δεν το περιμένουμε με ενδεχομένως ανυπολόγιστο κόστος…
Γιατί χρειάζεται η ανίχνευση σφαλμάτων και η διόρθωσή τους; Δίδαγμα: ακόμα και κατά το 99.9999% να είναι ακριβής ένας υπολογιστής, αυτό δεν είναι ούτε καν κοντά στο «αρκετά καλά»… Οι υπολογιστές πρέπει να αποθηκεύουν και να μεταδίδουν δισεκατομμύρια τμημάτων πληροφορίας χωρίς ούτε ένα λάθος, αλλά όπως και άλλες συσκευές αντιμετωπίζουν προβλήματα επικοινωνίας, π.χ., δεν μεταδίδουν άψογα την πληροφορία τα τηλέφωνα λόγω θορύβου, τα ηλεκτρικά καλώδια και οι ασύρματες επικοινωνίες λόγω παρεμβολών, φυσικά μέσα όπως σκληροί δίσκοι, CD/DVD λόγω καταστροφής, σκόνης, κτλ Πώς μπορούμε να πετύχουμε λιγότερο από 1 λάθος σε πολλά δισεκατομμύρια, όταν υπάρχουν οι παραπάνω προφανείς επικοινωνιακές δυσκολίες; με χρήση σωστών ιδεών, μπορούν να χρησιμοποιηθούν ακόμα και εξαιρετικά μη αξιόπιστα επικοινωνιακά κανάλια για τη μετάδοση δεδομένων με εξαιρετικά χαμηλό ρυθμό εμφάνισης σφαλμάτων - τόσο χαμηλό που τα λάθη μπορούν πρακτικά να εξαλειφθούν πλήρως
Η ιδέα της επανάληψης (repetition) Για να σιγουρευτούμε ότι κάποια πληροφορία μεταφέρθηκε σωστά, αρκεί να την επαναλάβουμε μερικές φορές Αν κάποιος μάς υπαγορεύει έναν αριθμό τηλεφώνου ή έναν τραπεζικό λογαριασμό μέσω μιας κακής τηλεφωνικής σύνδεσης, πιθανότατα θα του ζητήσουμε να επαναλάβει τουλάχιστον μια φορά για να είμαστε σίγουροι ότι δεν έγινε κάποιο λάθος Το ίδιο κάνουν και οι υπολογιστές
Η ιδέα της επανάληψης (repetition) Έστω ένας υπολογιστής τράπεζας που προσπαθεί να μάς μεταδώσει το υπόλοιπο του λογαριασμού μας μέσω internet Το υπόλοιπο είναι στα αλήθεια $5213.75, αλλά το δίκτυο δεν είναι πολύ αξιόπιστο και κάθε ψηφίο μπορεί να μεταδοθεί λάθος με πιθανότητα 20% Την πρώτη φορά που μεταδίδεται το υπόλοιπο φτάνει σαν $5293.75 χωρίς φυσικά να μπορούμε να γνωρίζουμε αν αυτό είναι σωστό ή λάθος Χρησιμοποιώντας την ιδέα της επανάληψης, μπορούμε να έχουμε μια πολύ καλή εκτίμηση του πραγματικού υπολοίπου
Η ιδέα της επανάληψης (repetition) Ζητάμε να μεταδοθεί το υπόλοιπο του λογαριασμού μας 5 φορές και λαμβάνουμε τις παρακάτω απαντήσεις: Κάποιες από τις μεταδόσεις έχουν 1 ή περισσότερα ψηφία λάθος και υπάρχει και μετάδοση στην οποία όλα τα ψηφία είναι σωστά Αλλά εμείς δεν έχουμε τρόπο να γνωρίζουμε πού είναι τα λάθη δε μπορούμε να επιλέξουμε τη μετάδοση 2 που είναι η σωστή Μετάδοση 1: $ 5 2 9 3 . 7 5 Μετάδοση 2: $ 5 2 1 3 . 7 5 Μετάδοση 3: $ 5 2 1 3 . 1 1 Μετάδοση 4: $ 5 4 4 3 . 7 5 Μετάδοση 5: $ 7 2 1 8 . 7 5
Η ιδέα της επανάληψης (repetition) Όμως, μπορούμε να εξετάσουμε κάθε ψηφίο χωριστά, κοιτώντας το ψηφίο αυτό σε όλες τις μεταδόσεις και επιλέγοντας την τιμή που εμφανίζεται συχνότερα Να τα αποτελέσματα, όπου το πιο συχνά εμφανιζόμενο ψηφίο αναφέρεται στο τέλος: Μετάδοση 1: $ 5 2 9 3 . 7 5 Μετάδοση 2: $ 5 2 1 3 . 7 5 Μετάδοση 3: $ 5 2 1 3 . 1 1 Μετάδοση 4: $ 5 4 4 3 . 7 5 Μετάδοση 5: $ 7 2 1 8 . 7 5 Ψηφίο που εμφανίζεται συχνότερα:
Η ιδέα της επανάληψης (repetition) Ψηφίο 1: στις μεταδόσεις 1-4, το πρώτο ψηφίο ήταν 5, ενώ στη μετάδοση 5 το πρώτο ψηφίο ήταν 7 αν και δε μπορούμε να είμαστε απόλυτα σίγουροι, ή πιο πιθανή τιμή του πρώτου ψηφίου του τραπεζικού μας υπολοίπου πρέπει να είναι το 5 Ψηφίο 2: η τιμή 2 εμφανίστηκε 4 φορές ενώ η τιμή 4 εμφανίστηκε μόνο 1 φορά η τιμή 2 είναι η πιθανότερη για το δεύτερο ψηφίο του τραπεζικού υπολοίπου Ψηφίο 3: εδώ υπάρχουν 3 εκδοχές: η τιμή 1 εμφανίζεται 3 φορές, η τιμή 9 εμφανίζεται 1 φορά και η τιμή 4 εμφανίζεται 1 φορά η τιμή 1 είναι η πιθανότερη για το τρίτο ψηφίο του τραπεζικού υπολοίπου Κάνοντας το ίδιο για όλα τα ψηφία: η τελική εκτίμηση για το τραπεζικό μας υπόλοιπο είναι $5213.75 που είναι πράγματι και η σωστή… Μετάδοση 1: $ 5 2 9 3 . 7 5 Μετάδοση 2: $ 5 2 1 3 . 7 5 Μετάδοση 3: $ 5 2 1 3 . 1 1 Μετάδοση 4: $ 5 4 4 3 . 7 5 Μετάδοση 5: $ 7 2 1 8 . 7 5 Ψηφίο που εμφανίζεται συχνότερα:
Η ιδέα της επανάληψης (repetition): προβλήματα… Κατά κάποιον τρόπο έχουμε λύσει το πρόβλημα, αλλά υπάρχουν δύο «προβληματάκια» Το ποσοστό σφαλμάτων για το συγκεκριμένο κανάλι επικοινωνίας ήταν μόνο 20% και στην πράξη οι υπολογιστές πρέπει να καταφέρουν να επικοινωνήσουν πάνω από κανάλια πολύ χειρότερα από αυτό… Η τελική απάντηση/μαντεψιά αποδείχθηκε ότι ήταν η σωστή στο προηγούμενο παράδειγμα, αλλά δεν υπάρχει καμία εγγύηση ότι αυτό θα συμβαίνει πάντα: πρόκειται απλά για μαντεψιά με βάση την τιμή που νομίζουμε ότι είναι η πιο πιθανή για να αντιστοιχεί στο τραπεζικό μας υπόλοιπο Και οι δύο προβληματισμοί αντιμετωπίζονται εύκολα: αυξάνουμε το πλήθος των επαναμεταδόσεων μέχρι η αξιοπιστία να γίνει όσο υψηλή επιθυμούμε…
Η ιδέα της επανάληψης (repetition): λύσεις στα προβλήματα… Υποθέστε ποσοστό σφαλμάτων 50% (αντί για 20% που υποθέσαμε πριν) Ζητάμε στην τράπεζα να μεταδώσει το τραπεζικό μας υπόλοιπο 1000 φορές (αντί για 5) Εξετάζουμε το πρώτο ψηφίο (ανάλογα επιχειρήματα ισχύουν και για τα άλλα ψηφία): Ποσοστό λάθους 50% περίπου σε μισές από τις μεταδόσεις η τιμή του ψηφίου θα είναι σωστή , δηλ, θα μεταδοθεί η τιμή 5 – ενώ στις υπόλοιπες μισές μεταδόσεις η τιμή θα μεταδοθεί λάθος θα υπάρχουν περίπου 500 εμφανίσεις της τιμής 5 και μόνο περίπου 50 εμφανίσεις των υπόλοιπων ψηφίων (0-4 και 6-9) Αποδεικνύεται ότι ακόμα κι αν μεταδίδαμε ένα νέο τραπεζικό υπόλοιπο ανά δευτερόλεπτο με την παραπάνω μέθοδο θα έπρεπε να περιμένουμε για τρισεκατομμύρια χρόνια για να κάνουμε λάθος πρόβλεψη του τραπεζικού υπολοίπου…
Η ιδέα της επανάληψης (repetition): συμπέρασμα… Συμπέρασμα: επαναλαμβάνοντας ένα μη αξιόπιστο μήνυμα αρκετές φορές, μπορούμε να το κάνουμε όσο αξιόπιστο θέλουμε Παρατήρηση: στην ανάλυσή μας, υποθέσαμε ότι τα σφάλματα συμβαίνουν τυχαία – αν μια κακόβουλη οντότητα σκόπιμα παρεμβάλλεται στη μετάδοση και επιλέγει τα σφάλματα, η ιδέα της επανάληψης γίνεται ευάλωτη, αλλά μεταγενέστεροι κώδικες αντιμετωπίζουν και αυτό το ενδεχόμενο Η ιδέα της επανάληψης δεν είναι αρκετά καλή για τους σύγχρονους υπολογιστές: όταν μεταδίδεται ένα μικρό τμήμα πληροφορίας – όπως π.χ., ένας τραπεζικός λογαριασμός, η επαναμετάδοση για 1000 φορές δεν κοστίζει ακριβά, αλλά θα ήταν εντελώς μη πρακτική η επαναμετάδοση για 1000 φορές ενός μεγάλου πακέτου λογισμικού (των π.χ., 200 megabytes)
Εντοπισμός και διόρθωση σφάλματος Λύση 1: επανάληψη Ανησυχία 1: μεγάλο ποσοστό σφάλματος στη μετάδοση ΟΚ: ζητάω πολλές επαναμεταδόσεις Ανησυχία 2: μεγάλα μηνύματα ΠΡΟΒΛΗΜΑ: μεγάλο overhead – ΤΙ ΚΑΝΩ; Λύση 2: περίσσεια – ενσωματώνω παραπάνω πληροφορία στο μήνυμα – κωδικοποιώ το μήνυμα
Η ιδέα της περίσσειας (redundancy) Βελτιωμένη ιδέα: δεν αρκεί να σταλεί μόνο το αρχικό μήνυμα αλλά πρέπει να σταλεί και κάτι παραπάνω για να αυξηθεί η αξιοπιστία Στην ιδέα της επανάληψης το «κάτι παραπάνω» ήταν τα παραπάνω αντίγραφα του αρχικού μηνύματος Αλλά υπάρχουν κι άλλοι τύποι παραπάνω πραγμάτων που μπορούν να σταλούν για να βελτιωθεί η αξιοπιστία που στην επιστήμη των υπολογιστών καλούνται με τον όρο “περίσσεια (redundancy)” Η περίσσεια αυτή μπορεί να προστεθεί και στο αρχικό μήνυμα Στη συνέχεια θα μελετήσουμε μια μορφή περίσσειας σύμφωνα με την οποία το αρχικό μήνυμα μετατρέπεται σε ένα μήνυμα μεγαλύτερου μήκους (με πρόσθεση συμπληρωματικής πληροφορίας): Το αρχικό μήνυμα διαγράφεται και αντικαθίσταται από ένα διαφορετικό, μεγαλύτερου μεγέθους Λαμβάνοντας το επιμηκυμένο μήνυμα μπορούμε να το μετατρέψουμε στο αρχικό ακόμα κι αν έχει υποστεί μερική καταστροφή λόγω κακού επικοινωνιακού καναλιού
Η ιδέα της περίσσειας (redundancy): παράδειγμα Προσπαθούμε να μεταδώσουμε το τραπεζικό υπόλοιπο $5213.75 πάνω από μη αξιόπιστο επικοινωνιακό κανάλι που τυχαία αλλάζει 20% των ψηφίων οπότε προσπαθούμε να μεταδώσουμε αντί για το “$5213.75” ένα μεγαλύτερο σε μήκος μήνυμα που να περιέχει την ίδια πληροφορία Μεταδίδουμε απλά τις αντίστοιχες αγγλικές λέξεις: five two one three point seven five Υποθέτουμε ότι περίπου 20% των χαρακτήρων του μηνύματος μετατρέπονται τυχαία σε άλλους εξαιτίας του κακού καναλιού και τελικά το μήνυμα μεταδίδεται σαν: fiqe kwo one thrxp point sivpn fivq Αν και δύσκολο να διαβαστεί, καθένας που γνωρίζει αγγλικά θα καταλάβει ότι το παραποιημένο μήνυμα αντιστοιχεί στο πραγματικό τραπεζικό υπόλοιπο $5213.75 Σημείο κλειδί: οι κωδικές λέξεις (code words) όπως “one,” “two,” “three”, κ.τ.λ. Επειδή χρησιμοποιήσαμε ένα επαυξημένο μήνυμα, είναι δυνατόν αξιόπιστα να ανιχνεύσουμε και να διορθώσουμε κάθε αλλαγή στο μήνυμα: αν μάς πουν ότι οι χαρακτήρες “fiqe” αναπαριστούν έναν αριθμό στα αγγλικά και ότι μόνο ένας χαρακτήρας έχει αλλαχτεί, σίγουρα μπορούμε να καταλάβουμε ότι το αρχικό μήνυμα ήταν “five” αφού δεν υπάρχει άλλος αριθμός στα αγγλικά που να μπορεί να προκύψει από το “fiqe” με αλλαγή ενός μόνο χαρακτήρα Αντίθετα, αν μάς πουν ότι τα ψηφία “367” αναπαριστούν κάποιον αριθμό αλλά ένα από τα ψηφία έχει αλλαχτεί, δεν έχουμε τρόπο να γνωρίζουμε ποιος ήταν ο αρχικός αριθμός, γιατί δεν έχει προστεθεί συμπληρωματική πληροφορία στο μήνυμα
Η ιδέα της περίσσειας (redundancy): παράδειγμα Προσπαθούμε να μεταδώσουμε το τραπεζικό υπόλοιπο $5213.75 πάνω από μη αξιόπιστο επικοινωνιακό κανάλι που τυχαία αλλάζει 20% των ψηφίων οπότε προσπαθούμε να μεταδώσουμε αντί για το “$5213.75” ένα μεγαλύτερο σε μήκος μήνυμα που να περιέχει την ίδια πληροφορία Μεταδίδουμε απλά τις αντίστοιχες αγγλικές λέξεις: five two one three point seven five Υποθέτουμε ότι περίπου 20% των χαρακτήρων του μηνύματος μετατρέπονται τυχαία σε άλλους εξαιτίας του κακού καναλιού και τελικά το μήνυμα μεταδίδεται σαν: fiqe kwo one thrxp point sivpn fivq Αν και δύσκολο να διαβαστεί, καθένας που γνωρίζει αγγλικά θα καταλάβει ότι το παραποιημένο μήνυμα αντιστοιχεί στο πραγματικό τραπεζικό υπόλοιπο $5213.75 Σημείο κλειδί: οι κωδικές λέξεις (code words) όπως “one,” “two,” “three”, κ.τ.λ. Επειδή χρησιμοποιήσαμε ένα επαυξημένο μήνυμα, είναι δυνατόν αξιόπιστα να ανιχνεύσουμε και να διορθώσουμε κάθε αλλαγή στο μήνυμα: αν μάς πουν ότι οι χαρακτήρες “fiqe” αναπαριστούν έναν αριθμό στα αγγλικά και ότι μόνο ένας χαρακτήρας έχει αλλαχτεί, σίγουρα μπορούμε να καταλάβουμε ότι το αρχικό μήνυμα ήταν “five” αφού δεν υπάρχει άλλος αριθμός στα αγγλικά που να μπορεί να προκύψει από το “fiqe” με αλλαγή ενός μόνο χαρακτήρα Αντίθετα, αν μάς πουν ότι τα ψηφία “367” αναπαριστούν κάποιον αριθμό αλλά ένα από τα ψηφία έχει αλλαχτεί, δεν έχουμε τρόπο να γνωρίζουμε ποιος ήταν ο αρχικός αριθμός, γιατί δεν έχει προστεθεί συμπληρωματική πληροφορία στο μήνυμα five two one three point seven five fiqe kwo one thrxp point sivpn fivq
Η ιδέα της περίσσειας (redundancy): πώς δουλεύει Τα μηνύματα αποτελούνται από “σύμβολα” Στο παράδειγμα: τα σύμβολα είναι τα αριθμητικά ψηφία 0-9 (για ευκολία αγνοούμε το σύμβολο του δολαρίου και την υποδιαστολή) Κάθε σύμβολο αντιστοιχίζεται σε μια κωδική λέξη Στο παράδειγμα: το σύμβολο 1 αντιστοιχίζεται στην κωδική λέξη “one,” το 2 στην “two,” κ.ο.κ. Για να μεταδώσουμε το μήνυμα, μεταφράζουμε κάθε σύμβολο στην κωδική του λέξη και μετά στέλνουμε το τροποποιημένο μήνυμα πάνω από ένα μη αξιόπιστο επικοινωνιακό κανάλι Όταν λαμβάνεται το μήνυμα, εξετάζεται κάθε τμήμα του μηνύματος και ελέγχεται αν είναι πράγματι κάποια κωδική λέξη Αν είναι (π.χ., “five”), μετατρέπεται στο αντίστοιχο σύμβολο (δηλ., 5) Αν δεν είναι (π.χ., “fiqe”), εντοπίζεται η κωδική λέξη με την οποία ταιριάζει περισσότερο (στην περίπτωσή μας η “five”) και μετατρέπεται στο αντίστοιχο σύμβολο (δηλ., το 5)
Ένας κώδικας που χρησιμοποιείται στην πραγματικότητα από υπολογιστές. Κωδικοποίηση Αποκωδικοποίηση 1 one 2 two 3 three 4 four 5 five five 5 (ακριβές ταίριασμα) fiqe 5 (πλησιέστερο ταίριασμα) twe 2 (πλησιέστερο ταίριασμα) Κωδικοποίηση Αποκωδικοποίηση 0000 0000000 0010111 0010 (ακριβές ταίριασμα) 0001 0001011 0010110 0010 (πλησιέστερο ταίριασμα) 0010 1011100 0011 (πλησιέστερο ταίριασμα) 0011 0011100 0100 0100110 ο (7,4) κώδικας Hamming Ένας κώδικας που χρησιμοποιείται στην πραγματικότητα από υπολογιστές. Αναφέρονται μόνο 5 από τις 16 πιθανές 4-ψήφιες εισόδους. Και για τις υπόλοιπες εισόδους υπάρχουν κωδικές λέξεις που παραλείπονται εδώ.
Η ιδέα της περίσσειας (redundancy) Οι υπολογιστές χρησιμοποιούν την ιδέα της περίσσειας συνεχώς για να αποθηκεύσουν και να μεταδώσουν πληροφορία Στην πραγματικότητα, οι κωδικές λέξεις είναι πιο πολύπλοκες (και μαθηματικά τεκμηριωμένες) από τις αγγλικές λέξεις του παραδείγματος Στο κάτω μέρος του προηγούμενου σχήματος, παρουσιάζεται ο (7,4) κώδικας Hamming που είναι ένας από αυτούς που ανακάλυψε ο Richard Hamming στα Bell Labs το 1947 λόγω της δυσλειτουργίας του υπολογιστή της εταιρείας τα ΣΚ… Ο Hamming δημοσίευσε τους κώδικές του το 1950, λόγω ύπαρξης απαίτησης για σχετική πατέντα από τη Bell Η βασική διαφορά από τον κώδικα του παραδείγματος είναι η χρήση μόνο 0 και 1 Ο λόγος είναι ότι κάθε πληροφορία που αποθηκεύεται ή μεταδίδεται με υπολογιστή μετατρέπεται σε ακολουθίες με 0 και 1, οπότε κάθε πραγματικός κώδικας αναγκαστικά περιέχει μόνο αυτά τα 2 ψηφία
(7,4) κώδικας Hamming Κατά την κωδικοποίηση, σε κάθε ομάδα 4 ψηφίων προστίθεται συμπληρωματική πληροφορία οπότε παράγεται μία κωδική λέξη με 7 ψηφία Κατά την αποκωδικοποίηση, ψάχνουμε πρώτα για πλήρες ταίριασμα των 7 ψηφίων που λάβαμε με κάποια κωδική λέξη – αν δεν βρούμε, διαλέγουμε την περισσότερο ταιριαστή κωδική λέξη Ο κώδικας έχει σχεδιαστεί έτσι ώστε κάθε λάθος σε μια 7ψήφια κωδική λέξη να μπορεί να διορθωθεί χωρίς να υπάρχει ασάφεια (υπάρχουν σχετικές μαθηματικές αποδείξεις στις οποίες δεν θα εμβαθύνουμε εδώ)
(7,4) κώδικας Hamming 4-ψήφια μηνύματα (d1d2d3d4) κωδικοποιούνται σε 7-ψήφιες λέξεις υπάρχουν 3 επιπλέον ψηφία ελέγχου σε κάθε κωδικοποιημένο μήνυμα (p1p2d1p3d2d3d4) Οι θέσεις του κωδικοποιημένου μηνύματος αριθμούνται από αριστερά προς τα δεξιά Θέσεις που έχουν αριθμηθεί με δύναμη του 2 (θέση i = 2k) αντιστοιχούν σε ψηφία ελέγχου (pi) ενώ οι υπόλοιπες θέσεις αντιστοιχούν σε ψηφία του αρχικού μηνύματος Το ψηφίο ελέγχου p1 ελέγχει τα ψηφία του αρχικού μηνύματος σε θέσεις που το αριστερότερο ψηφίο είναι 1 (δηλ., τις θέσεις 3=011,5=101,7=111) Το ψηφίο ελέγχου p2 ελέγχει τα ψηφία του αρχικού μηνύματος σε θέσεις που το δεύτερο αριστερότερο ψηφίο είναι 1 (δηλ., τις θέσεις 3=011,6=110,7=111) Το ψηφίο ελέγχου p3 ελέγχει τα ψηφία του αρχικού μηνύματος σε θέσεις που το τρίτο αριστερότερο ψηφίο είναι 1 (δηλ., τις θέσεις 5=101,6=110,7=111) «ελέγχει»: το ψηφίο ελέγχου pi λαμβάνει την τιμή 1 αν το πλήθος των 1 στα ψηφία του μηνύματος που του αντιστοιχούν είναι περιττό, αλλιώς λαμβάνει την τιμή 0 Θέση 1=20 Θέση 2=21 Θέση 3=011 Θέση 4=22 Θέση 5=101 Θέση 6=110 Θέση 7=111 p1 p2 d1 p3 d2 d3 d4
(7,4) κώδικας Hamming: παράδειγμα Αρχικό μήνυμα: d1d2d3d4=1011 Κωδικοποιημένο μήνυμα: p1p2d1p3d2d3d4=0110011 p1=0 (αφού d1d2d4=101) p2=1 (αφού d1d3d4=111) p3=0 (αφού d2d3d4=011) Θέση 1=20 Θέση 2=21 Θέση 3=011 Θέση 4=22 Θέση 5=101 Θέση 6=110 Θέση 7=111 p1=0 p2=1 d1 =1 p3=0 d2 = 0 d3 = 1 d4 = 1
(7,4) κώδικας Hamming: παράδειγμα Αρχικό μήνυμα: d1d2d3d4=1011 Κωδικοποιημένο μήνυμα: p1p2d1p3d2d3d4=0110011 p1=0 (αφού d1d2d4=101) p2=1 (αφού d1d3d4=111) p3=0 (αφού d2d3d4=011) Μήνυμα που λαμβάνεται μετά τη μετάδοση: 0110011 Ελέγχω (ξανα-υπολογίζω με βάση το μήνυμα) τα ψηφία ελέγχου: αν είναι σωστά το μήνυμα μεταδόθηκε σωστά Μήνυμα που λαμβάνεται μετά τη μετάδοση: 1111011 Ελέγχω (ξανα-υπολογίζω με βάση το μήνυμα) τα ψηφία ελέγχου: τα ψηφία ελέγχου p1 και p3 δεν είναι σωστά αυτά βρίσκονται στις θέσεις 1+4=5 το ψηφίο στη θέση 5 είναι το λάθος Μήνυμα που λαμβάνεται μετά τη μετάδοση: 0111011 Ελέγχω (ξανα-υπολογίζω με βάση το μήνυμα) τα ψηφία ελέγχου: το ψηφίο ελέγχου p3 δεν είναι σωστό το ίδιο το ψηφίο ελέγχου είναι το λάθος Θέση 1=20 Θέση 2=21 Θέση 3=011 Θέση 4=22 Θέση 5=101 Θέση 6=110 Θέση 7=111 p1=0 p2=1 d1 =1 p3=0 d2 = 0 d3 = 1 d4 = 1
Ο (7,4) κώδικας Hamming 1=001 2=010 3=011 4=100 5=101 6=110 7=111 p1 d1 p3 d2 d3 d4 1
Επανάληψη ή Περίσσεια… Στην πράξη, η ιδέα της περίσσειας προτιμάται σε σχέση με την ιδέα της επανάληψης λόγω του σχετικά χαμηλότερου κόστους της Το κόστος συστημάτων διόρθωσης σφαλμάτων μετριέται με βάση το “overhead”, δηλ., το ποσό της παραπάνω πληροφορίας που πρέπει να σταλεί για να είμαστε σίγουροι ότι το μήνυμα θα ληφθεί σωστά Το overhead της ιδέας της επανάληψης είναι τεράστιο αφού πρέπει να στείλουμε πολλά αντίγραφα ολόκληρου του μηνύματος Το overhead της ιδέας της περίσσειας εξαρτάται από το ακριβές σύνολο των κωδικών λέξεων που χρησιμοποιούμε Στο παράδειγμα: το μήνυμα με τις αγγλικές λέξεις είχε 29 χαρακτήρες ενώ το αρχικό είχε μόνο 6 νούμερα μεγάλο overhead Αλλά στην πράξη χρησιμοποιούνται σύνολα κωδικών λέξεων που έχουν δημιουργηθεί ώστε να εισάγουν πολύ λιγότερη συμπληρωματική πληροφορία και να έχουν πολύ υψηλή απόδοση ως προς την πιθανότητα να μην ανιχνευθεί κάποιο υπαρκτό σφάλμα Μέχρι τώρα αναφερθήκαμε ρητά στη μετάδοση πληροφορίας αλλά οι σχετικές μέθοδοι ισχύουν και για την αποθήκευσή της Τα CD, τα DVD, και οι σκληροί δίσκοι βασίζονται εξαιρετικά σε κώδικες διόρθωσης σφαλμάτων για να πετύχουν την εξέχουσα αξιοπιστία που διαπιστώνουμε στην πράξη
Εντοπισμός και διόρθωση σφάλματος Λύση 1: επανάληψη Καλό: αυξάνοντας τις επαναμεταδόσεις σχεδόν μηδενίζεται η πιθανότητα λάθους στη μετάδοση (σχεδόν σίγουρα θα τα εντοπίσω και θα τα διορθώσω) Ανησυχία 1: μεγάλο ποσοστό σφάλματος στη μετάδοση ΟΚ: ζητάω πολλές επαναμεταδόσεις Ανησυχία 2: αν έχω μεγάλα μηνύματα;;; ΠΡΟΒΛΗΜΑ: μεγάλο overhead – ΤΙ ΚΑΝΩ; Λύση 2: περίσσεια – ενσωματώνω παραπάνω πληροφορία στο μήνυμα – κωδικοποιώ το μήνυμα (π.χ., με κώδικα Hamming) Καλό: μικρό overhead (τουλάχιστον σε σύγκριση με την επανάληψη) Ανησυχία 1: μπορώ να εντοπίσω και να διορθώσω το πολύ 1 λάθος – αν υπάρχουν παραπάνω; Λύση 2.5: μπορώ να εντοπίσω και να διορθώσω παραπάνω από 1 λάθη με κώδικες Reed-Solomon… Λύση 3: καρφίτσωμα (pinpoint) ή αλλιώς διδιάστατη ισοτιμία (two-dimensional parity)
Εντοπισμός σφάλματος … ξεχνάμε για λίγο τη διόρθωση και εστιάζουμε στον εντοπισμό… Και τι κάνουμε με τη διόρθωση;;;;;;; Αν εντοπίσουμε το λάθος, διορθώνουμε ζητώντας επαναμετάδοση…
Η ιδέα του αθροίσματος ελέγχου (checksum) Οι ιδέες της επανάληψης και της περίσσειας είναι τρόποι για ταυτόχρονο εντοπισμό και διόρθωση σφαλμάτων σε δεδομένα Εναλλακτική προσέγγιση: ας αφήσουμε τη διόρθωση και ας εστιάσουμε στον εντοπισμό σφαλμάτων (δες και το σχετικό απόφθεγμα του φιλοσόφου John Locke από τον 17ο μ.Χ. αιώνα) Για πολλές εφαρμογές, και μόνο ο εντοπισμός του σφάλματος είναι αρκετός αφού αν εντοπιστεί λάθος ζητάμε αντίγραφο των δεδομένων συνεχώς μέχρι να τα λάβουμε χωρίς λάθη Αυτή η στρατηγική – που καλείται ιδέα του αθροίσματος ελέγχου (“checksum trick”) - χρησιμοποιείται συχνά: π.χ., από σχεδόν όλες τις Διαδικτυακές συνδέσεις
Η ιδέα του αθροίσματος ελέγχου (checksum) Υποθέτουμε ότι όλα τα μηνύματα αποτελούνται μόνο από αριθμούς Πρόκειται για πολύ ρεαλιστική υπόθεση αφού οι υπολογιστές αποθηκεύουν κάθε πληροφορία με μορφή αριθμών και απλά μεταφράζουν τους αριθμούς αυτούς σε κείμενο ή εικόνες όταν μάς παρουσιάζουν την αντίστοιχη πληροφορία Κάθε πιθανή επιλογή συμβόλων για την κωδικοποίηση των μηνυμάτων δεν επηρεάζει τις τεχνικές που περιγράφουμε εδώ Άλλες φορές είναι πιο απλό να κωδικοποιούμε με αριθμητικά ψηφία (τα ψηφία 0- 9) και άλλες με αλφαβητικά σύμβολα (τους χαρακτήρες a-z), αλλά σε κάθε περίπτωση μπορεί να συμφωνηθεί μια μετάφραση μεταξύ αυτών των συνόλων συμβόλων Π.χ., μια προφανής μετάφραση από αλφαβητικά σε αριθμητικά σύμβολα θα ήταν a 01, b 02,…, z 26 Οπότε δεν έχει σημασία αν θα μελετήσουμε τις τεχνικές υποθέτοντας ότι μεταδίδονται αριθμητικά ή αλφαβητικά μηνύματα αφού κάθε τεχνική μπορεί να εφαρμοστεί σε κάθε τύπο μηνύματος (αλφαβητικού ή αριθμητικού) κάνοντας αρχικά την απαραίτητη μετάφραση
Η ιδέα του αθροίσματος ελέγχου (checksum): πώς δουλεύει Υπάρχουν διάφορες εκδοχές της ιδέας – εμείς θα παρουσιάσουμε την απλούστερη που καλείται απλό άθροισμα ελέγχου (“simple checksum”) Αθροίζουμε τα ψηφία του μηνύματος και κρατάμε μόνο το τελευταίο (δεξιότερο) ψηφίο του αθροίσματος που αποτελεί και το αποτέλεσμα του απλού αθροίσματος ελέγχου (“simple checksum”) Παράδειγμα: έστω ότι το μήνυμα είναι 4 6 7 5 6, το άθροισμα των ψηφίων του είναι 4 + 6 + 7 + 5 + 6 = 28, κρατάμε μόνο το τελευταίο ψηφίο, δηλ., το 8 που αποτελεί το αποτέλεσμα του απλού αθροίσματος ελέγχου
Η ιδέα του αθροίσματος ελέγχου (checksum) Πώς χρησιμοποιείται το άθροισμα ελέγχου; «κολλάμε» το αποτέλεσμα του αθροίσματος ελέγχου στο τέλος του μηνύματός μας πριν το αποστείλουμε οπότε όταν λαμβάνεται το μήνυμα, μπορεί να υπολογιστεί το αποτέλεσμα του αθροίσματος ελέγχου εκ νέου, να συγκριθεί με το προηγούμενο αποτέλεσμα που είχαμε στείλει και να διαπιστωθεί η ορθότητα του μηνύματος Δηλ., οι παραλήπτες ελέγχουν την ορθότητα του μηνύματος μέσω του αθροίσματος των συμβόλων του (“check” the “sum” of the message), εξ’ ού και η ορολογία άθροισμα ελέγχου (“checksum”)
Η ιδέα του αθροίσματος ελέγχου (checksum) Παράδειγμα: Αρχικό μήνυμα: 4 6 7 5 6 Τελευταίο ψηφίο αθροίσματος ελέγχου: 8 Μεταδιδόμενο μήνυμα: 4 6 7 5 6 8 Ο παραλήπτης χρησιμοποιεί την ιδέα του αθροίσματος ελέγχου και αντιλαμβάνεται ότι το άθροισμα ελέγχου που του στείλαμε είναι το τελευταίο ψηφίο 8 - επομένως το 8 δεν είναι ψηφίο του αρχικού μηνύματος και απομακρύνεται από το μήνυμα Ο παραλήπτης υπολογίζει ξανά το άθροισμα ελέγχου για το μήνυμα Αν δεν υπήρξαν λάθη στη μετάδοση θα υπολογίσει 4 + 6 + 7 + 5 + 6 = 28, θα κρατήσει το τελευταίο ψηφίο (που είναι 8), θα διαπιστώσει ότι είναι ίσο με το αντίστοιχο αποτέλεσμα που του στείλαμε και θα συμπεράνει ότι το μήνυμα μεταδόθηκε σωστά Αν υπήρξε λάθος στη μετάδοση και ο παραλήπτης έλαβε το μήνυμα 4 6 3 5 6 8, θα απομακρύνει το 8, θα υπολογίσει το 4 + 6 + 3 + 5 + 6 = 24, θα κρατήσει το τελευταίο ψηφίο (4), θα διαπιστώσει ότι δεν είναι ίσο με το 8 και θα ζητήσει επαναμετάδοση του μηνύματος (μέχρι να λάβει σωστά το μήνυμα)
Η ιδέα του αθροίσματος ελέγχου (checksum) Πόσο είναι το “overhead” αυτού του συστήματος ελέγχου λαθών (δηλ., πόσα επιπλέον ψηφία στέλνονται μαζί με το αρχικό μήνυμα); “overhead” = ένα μόνο ψηφίο για να εντοπιστεί ένα λάθος = το τελευταίο ψηφίο του αποτελέσματος του ελέγχου αθροίσματος: πολύ χαμηλό, ανεξάρτητο από το μήκος του αρχικού μηνύματος Πρόβλημα: με τον απλό έλεγχο αθροίσματος μπορεί να εντοπιστεί μόνον ένα λάθος στο αρχικό μήνυμα – αν υπάρχουν δύο ή περισσότερα λάθη στο αρχικό μήνυμα; Με το απλό άθροισμα ελέγχου μπορεί να εντοπιστούν μπορεί και όχι…
Στο πρώτο μήνυμα με δύο λάθη, το πρόβλημα εντοπίζεται… checksum αρχικό μήνυμα 4 6 7 5 8 μήνυμα με ένα λάθος 1 μήνυμα με δύο λάθη μήνυμα με δύο (διαφορετικά) λάθη 2 Αν υπάρχει μόνο ένα λάθος στο αρχικό μήνυμα, το απλό άθροισμα ελέγχου θα το εντοπίσει. Όταν υπάρχουν παραπάνω από ένα λάθη, το πρόβλημα μπορεί να εντοπιστεί μπορεί και όχι: Στο πρώτο μήνυμα με δύο λάθη, το πρόβλημα εντοπίζεται… Στο δεύτερο μήνυμα με δύο λάθη, το πρόβλημα ΔΕΝ εντοπίζεται…
Εντοπισμός σφάλματος … ξεχνάμε για λίγο τη διόρθωση και εστιάζουμε στον εντοπισμό… Και τι κάνουμε με τη διόρθωση;;;;;;; Αν εντοπίσουμε το λάθος, διορθώνουμε ζητώντας επαναμετάδοση… Λύση 1: προσθέτουμε απλό checksum bit στο τέλος του μηνύματος Καλό: μικρό overhead Ανησυχία: εντοπίζεται το πολύ 1 λάθος – αν υπάρχουν παραπάνω λάθη;;;;;;;; Λύση 2: προσθέτουμε απλό checksum bit και staircase checksum bit στο τέλος του μηνύματος
Η ιδέα του κλιμακωτού αθροίσματος ελέγχου (checksum) Λύση: βελτιώνουμε ελαφρώς την ιδέα και ορίζουμε έναν νέο τύπο αθροίσματος ελέγχου που καλείται κλιμακωτό άθροισμα ελέγχου (“staircase” checksum) Φανταζόμαστε ότι ανεβαίνουμε μία σκάλα (κλίμακα) όταν υπολογίζουμε το άθροισμα ελέγχου: κάθε σκαλοπάτι είναι αριθμημένο με τους αριθμούς 1,2,3, κ.τ.λ. Υπολογίζουμε το staircase checksum ως εξής: προσθέτουμε τα ψηφία του μηνύματος (όπως πριν), αλλά κάθε ψηφίο πολλαπλασιάζεται με τον αριθμό του σκαλοπατιού στο οποίο βρίσκεται (κάθε ψηφίο βρίσκεται σε άλλο σκαλοπάτι) – στο τέλος κρατάμε μόνο το τελευταίο ψηφίο του αποτελέσματος (όπως πριν) Παράδειγμα: αν το αρχικό μήνυμα είναι 4 6 7 5 6 το staircase checksum του “46756” είναι το 7: (1x4)+(2x6)+(3x7)+(4x5)+(5x6)=4+12+21+20+30=87
Σύγκριση απλού και κλιμακωτού αθροίσματος ελέγχου Απλό checksum Κλιμακωτό checksum αρχικό μήνυμα 4 6 7 5 8 μήνυμα με ένα λάθος 1 μήνυμα με δύο λάθη 2 μήνυμα με δύο (διαφορετικά) λάθη 9 μήνυμα με δύο (πάλι διαφορετικά) λάθη
Η ιδέα του αθροίσματος ελέγχου (checksum) Επομένως: μεταδίδοντας το αρχικό μήνυμα με δύο επιπλέον ψηφία, το τελευταίο ψηφίο του απλού και του κλιμακωτού αθροίσματος ελέγχου, μπορούμε πάντα να εντοπίζουμε μέχρι το πολύ δύο λάθη στο αρχικό μήνυμα Παράδειγμα: Το μήνυμα “46756” μεταδίδεται σαν 4 6 7 5 6 8 7 Όταν λαμβάνεται, υποθέτοντας ότι είναι γνωστή η τεχνική που έχει χρησιμοποιηθεί,: Απομακρύνουμε τα 2 τελευταία ψηφία (το 8, που είναι το simple checksum και το 7 που είναι το staircase checksum) Υπολογίζουμε το simple checksum του υπόλοιπου μηνύματος (46756) που προκύπτει 8 και το staircase checksum που προκύπτει 7 Αν και οι δύο τιμές ταιριάζουν με αυτές που λάβαμε (στο παράδειγμα ταιριάζουν) δύο εκδοχές είναι πιθανές: είτε λάβαμε το μήνυμα σωστά, χωρίς λάθη είτε υπάρχουν τουλάχιστον 3 λάθη Αν υπάρχουν το πολύ 2 λάθη, τουλάχιστον ένα από τα δύο checksums θα διαφέρει σίγουρα από το πραγματικό
Η ιδέα του αθροίσματος ελέγχου (checksum) αρχικό μήνυμα 4 6 7 5 8 μήνυμα με ένα λάθος 1 μήνυμα με δύο λάθη 2 μήνυμα με δύο (διαφορετικά) λάθη 9 μήνυμα με δύο (πάλι διαφορετικά) λάθη
Η ιδέα του αθροίσματος ελέγχου (checksum) Η βασική ιδέα του αθροίσματος ελέγχου που περιγράψαμε δουλεύει για σχετικά μικρά μηνύματα (με λιγότερα από 10 ψηφία) αλλά παραπλήσιες ιδέες εφαρμόζονται και για μεγαλύτερα μηνύματα Είναι δυνατός ο ορισμός checksums μέσω συγκεκριμένων ακολουθιών απλών πράξεων όπως πρόσθεση ψηφίων μηνύματος, πολλαπλασιασμός ψηφίων με αριθμό «σκαλοπατιού», μετάθεση ψηφίων του μηνύματος σύμφωνα με δοσμένο πρότυπο… που αν και ακούγονται πολύπλοκες μπορούν να εκτελεστούν εξαιρετικά γρήγορα από υπολογιστές Ο ορισμός τέτοιων checksums αποδεικνύεται πολύ χρήσιμος και πρακτικός τρόπος ανίχνευσης σφαλμάτων σε μηνύματα
Η ιδέα του αθροίσματος ελέγχου (checksum) Η βασική ιδέα του αθροίσματος ελέγχου που περιγράψαμε παράγει μόνο 2 ψηφία checksum (τα ψηφία απλού και κλιμακωτού αθροίσματος ελέγχου ) αλλά τα πραγματικά checksums περιέχουν πολύ περισσότερα ψηφία – γύρω στα 150… Ο αριθμός των ψηφίων στο checksum (είτε 2 είτε περίπου 150) είναι προκαθορισμένος για κάθε σχετικό αλγόριθμο και φυσικά μπορούν να γίνουν όσο πολλά θέλουμε και - ταυτόχρονα - να παραμένουν πολύ λίγα σε σχέση με το μήκος του αντίστοιχου μηνύματος Υποθέστε ότι χρησιμοποιούμε ένα checksum των 100 ψηφίων για να διαπιστώσουμε την ορθότητα μετάδοσης ενός πακέτου λογισμικού μεγέθους 20 megabytes που κατεβάσαμε από το web Το checksum είναι μικρότερο από το 1/1000 του 1% του μεγέθους του πακέτου λογισμικού το επίπεδο του overhead είναι προφανώς αποδεκτό! Αποδεικνύεται με μαθηματικά ότι η πιθανότητα αποτυχίας εντοπισμού λάθους όταν χρησιμοποιούμε checksum αυτού του μεγέθους είναι τόσο πολύ μικρή που πρακτικά μπορεί να θεωρηθεί 0…!!
Η ιδέα του αθροίσματος ελέγχου (checksum) Προσοχή: λαμβάνοντας υπόψιν τεχνικές λεπτομέρειες, συμπεραίνουμε ότι και συστήματα που χρησιμοποιούν 100-ψήφια μπορούν να αποτύχουν στον εντοπισμό λαθών… Απαιτείται ειδικός τύπος checksums που καλούνται κρυπτογραφικές συναρτήσεις κατακερματισμού (cryptographic hash functions) ειδικά αν οι παραποιήσεις στο αρχικό μήνυμα δεν συμβαίνουν τυχαία λόγω κακού επικοινωνιακού καναλιού αλλά προκαλούνται σκόπιμα από κάποιον κακόβουλο αντίπαλο … Η εκδοχή αυτή είναι συνηθισμένη στην πράξη αφού είναι πιθανό κάποιος κακόβουλος hacker να θέλει να τροποποιήσει το πακέτο λογισμικού των 20 megabytes κατά τέτοιον τρόπο ώστε να παράγεται το ίδιο 100-ψήφιο checksum, αλλά στην πραγματικότητα να είναι ένα διαφορετικό το λογισμικό που θα εγκατασταθεί στον υπολογιστή μας! Η χρήση κρυπτογραφικών συναρτήσεων κατακερματισμού κάνει κάτι τέτοιο αδύνατον…
Εντοπισμός σφάλματος … ξεχνάμε για λίγο τη διόρθωση και εστιάζουμε στον εντοπισμό… Και τι κάνουμε με τη διόρθωση;;;;;;; Αν εντοπίσουμε το λάθος, διορθώνουμε ζητώντας επαναμετάδοση… Λύση 1: προσθέτουμε απλό checksum bit στο τέλος του μηνύματος Καλό: μικρό overhead Ανησυχία: εντοπίζεται το πολύ 1 λάθος – αν υπάρχουν παραπάνω λάθη;;;;;;;; Λύση 2: προσθέτουμε απλό checksum bit και staircase checksum bit στο τέλος του μηνύματος Ανησυχία: εντοπίζονται το πολύ 2 λάθη – αν υπάρχουν παραπάνω λάθη;;;;;;;; Λύση 3: κρυπτογραφικές συναρτήσεις κατακερματισμού - cryptographic has functions
Εντοπισμός και διόρθωση σφάλματος Λύση 1: επανάληψη Καλό: αυξάνοντας τις επαναμεταδόσεις σχεδόν μηδενίζεται η πιθανότητα λάθους στη μετάδοση (σχεδόν σίγουρα θα τα εντοπίσω και θα τα διορθώσω) Ανησυχία 1: μεγάλο ποσοστό σφάλματος στη μετάδοση ΟΚ: ζητάω πολλές επαναμεταδόσεις Ανησυχία 2: αν έχω μεγάλα μηνύματα;;; ΠΡΟΒΛΗΜΑ: μεγάλο overhead – ΤΙ ΚΑΝΩ; Λύση 2: περίσσεια – ενσωματώνω παραπάνω πληροφορία στο μήνυμα – κωδικοποιώ το μήνυμα (π.χ., με κώδικα Hamming) Καλό: μικρό overhead (τουλάχιστον σε σύγκριση με την επανάληψη) Ανησυχία 1: μπορώ να εντοπίσω και να διορθώσω το πολύ 1 λάθος – αν υπάρχουν παραπάνω; Λύση 2.5: μπορώ να εντοπίσω και να διορθώσω παραπάνω από 1 λάθη με κώδικες Reed-Solomon… Λύση 3: καρφίτσωμα (pinpoint) ή αλλιώς διδιάστατη ισοτιμία (two-dimensional parity)
Η ιδέα του καρφιτσώματος (pinpoint) Πρόβλημα: εντοπισμός και διόρθωση επικοινωνιακών σφαλμάτων Λύσεις που είδαμε ήδη: ιδέα επανάληψης αποστολής του αρχικού μηνύματος (μη αποδοτική) και ιδέα ενσωμάτωσης περίσσειας πληροφορίας στο αρχικό μήνυμα (αποδοτική) μέσω κωδικοποίησης του αρχικού μηνύματος (με κωδικές λέξεις) Πώς δημιουργούνται οι κωδικές λέξεις; Είδαμε στο παράδειγμα τη χρήση αγγλικών λέξεων για την κωδικοποίηση αριθμών που όμως είναι λιγότερο αποδοτικός τρόπος κωδικοποίησης από αυτούς που χρησιμοποιούνται από τους υπολογιστές στην πράξη… Είδαμε επίσης ένα πραγματικό παράδειγμα ενός κώδικα Hamming Θα περιγράψουμε μια μέθοδο κωδικοποίησης για την ιδέα της περίσσειας που μάς επιτρέπει να «καρφιτσώσουμε» το λάθος πολύ γρήγορα για αυτό και καλείται ιδέα του καρφιτσώματος (“pinpoint trick”)
Η ιδέα του καρφιτσώματος (pinpoint): πώς δουλεύει Υποθέτουμε για ευκολία ότι έχουμε μηνύματα που περιέχουν μόνο τα ψηφία 0-9 (αφού ό,τι και να περιέχουν τα μηνύματα μπορούν να μεταφραστούν σε αριθμούς) Υποθέτουμε για ευκολία (χωρίς βλάβη της γενικότητας) ότι το αρχικό μήνυμα έχει 16 ψηφία (μήνυμα με περισσότερα από 16 ψηφία το χωρίζουμε σε 16ψήφια τμήματα, μήνυμα με λιγότερα από 16 ψηφία το συμπληρώνουμε με 0) Βήμα 1: τοποθετούμε τα 16 ψηφία του μηνύματος σε ένα τετράγωνο που διαβάζεται από αριστερά προς δεξιά και από πάνω προς τα κάτω: αν το αρχικό μήνυμα είναι 4837543622563997 γίνεται: Βήμα 2: υπολογίζουμε ένα απλό checksum για κάθε γραμμή και το τοποθετούμε δεξιά στο τέλος κάθε γραμμής (π.χ., το checksum για τη δεύτερη γραμμή είναι 5 + 4 + 3 + 6 = 18 και κρατάμε το τελευταίο ψηφίο του αθροίσματος δηλ., το 8)
Η ιδέα του καρφιτσώματος (pinpoint) Βήμα 3: υπολογίζουμε απλά checksums για κάθε στήλη και τα προσθέτουμε κάτω κάτω στο τέλος κάθε στήλης (π.χ., το checksum για την τρίτη στήλη είναι 3 + 3 + 5 + 9 = 20 και κρατάμε το τελευταίο ψηφίο του αθροίσματος, δηλ., το 0) Βήμα 4: αναδιατάσσουμε τους αριθμούς ώστε να μπορούν να αποθηκευθούν και να μεταδοθούν ψηφίο-ψηφίο, διαβάζοντας τους αριθμούς από αριστερά προς τα δεξιά και από πάνω προς τα κάτω ώστε να προκύψει το εξής 24-ψήφιο μήνυμα: 483725436822565399784306
Η ιδέα του καρφιτσώματος (pinpoint): πώς χρησιμοποιείται… Αρχικό 16-ψήφιο μήνυμα: 4837543622563997 Μήνυμα με 24 ψηφία που λάβαμε: 483725436827565399784306 Βήμα 1 (για αποκωδικοποίηση): τοποθετούμε τα ψηφία σε ένα τετράγωνο 5x5 όπου η τελευταία γραμμή και η τελευταία στήλη περιέχουν ψηφία checksum που επισυνάφθηκαν στο αρχικό μήνυμα: Βήμα 2: υπολογίζουμε απλά checksums για τα 4 πρώτα ψηφία σε κάθε γραμμή και κάθε στήλη και καταγράφουμε τα αποτελέσματα σε νέα στήλη και γραμμή, αντίστοιχα, δίπλα στα σταλμένα checksums:
Η ιδέα του καρφιτσώματος (pinpoint) Υπάρχουν δύο σύνολα τιμών για τα checksums: οι τιμές που μάς έστειλαν και αυτές που υπολογίσαμε Αν οι αντίστοιχες τιμές είναι ίδιες το μήνυμα σχεδόν σίγουρα μεταδόθηκε σωστά Αν υπήρξε σφάλμα στην επικοινωνία κάποιες τιμές checksums θα είναι διαφορετικές Στο παράδειγμα υπάρχουν 2 διαφορές: στις τιμές 5 και 0 στην τρίτη γραμμή και στις τιμές 3 και 8 στη δεύτερη στήλη Η θέση των διαφορών υποδεικνύει που έγινε το λάθος!
Η ιδέα του καρφιτσώματος (pinpoint) Το λάθος έγινε στο εξής ψηφίο: Εντοπίσαμε το λάθος αλλά δεν το έχουμε διορθώσει ακόμα… Το διορθώνουμε αντικαθιστώντας το λάθος ψηφίο, δηλ., το 7, με κάποιο άλλο ώστε και τα δύο checksums να είναι σωστά Στην τρίτη στήλη το checksum έπρεπε να είναι 3 αλλά προέκυψε 8, οπότε πρέπει να μειωθεί κατά 5 μειώνουμε το λανθασμένο ψηφίο 7 κατά 5 και γίνεται 2…
Η ιδέα του καρφιτσώματος (pinpoint) Διαπιστώνουμε ότι πλέον η τρίτη γραμμή έχει checksum 5, που συμφωνεί με το αντίστοιχο checksum που λάβαμε Το λάθος εντοπίστηκε και διορθώθηκε! Το τελικό βήμα είναι να εξάγουμε το αρχικό 16-ψήφιο μήνυμα από το τετράγωνο 5x5 διαβάζοντάς το από αριστερά προς τα δεξιά και από πάνω προς τα κάτω (αγνοώντας φυσικά την τελευταία γραμμή και στήλη): 4837543622563997 που είναι ακριβώς το αρχικό μήνυμα
Η ιδέα του καρφιτσώματος (pinpoint) Η ιδέα του καρφιτσώματος (pinpoint trick) αναφέρεται στην επιστήμη των υπολογιστών ως “διδιάστατη ισοτιμία” (“two-dimensional parity”) Ο όρος «ισοτιμία» σημαίνει το ίδιο με τον υπολογισμό απλού checksum με δυαδικούς αριθμούς (που χρησιμοποιούν συνήθως οι υπολογιστές) Ο όρος «διδιάστατη» χρησιμοποιείται γιατί το μήνυμα τοποθετείται σε ένα πλέγμα δύο διαστάσεων (με γραμμές και στήλες) Η διδιάστατη ισοτιμία έχει χρησιμοποιηθεί σε πραγματικά υπολογιστικά συστήματα αλλά δεν είναι τόσο αποδοτική όσο άλλες συγκεκριμένες μέθοδοι περίσσειας που πάντως βασίζονται σε παραπλήσιες ιδέες…
Εντοπισμός και διόρθωση σφάλματος Λύση 1: επανάληψη Καλό: αυξάνοντας τις επαναμεταδόσεις σχεδόν μηδενίζεται η πιθανότητα λάθους στη μετάδοση (σχεδόν σίγουρα θα τα εντοπίσω και θα τα διορθώσω) Ανησυχία 1: μεγάλο ποσοστό σφάλματος στη μετάδοση ΟΚ: ζητάω πολλές επαναμεταδόσεις Ανησυχία 2: αν έχω μεγάλα μηνύματα??? ΠΡΟΒΛΗΜΑ: μεγάλο overhead – ΤΙ ΚΑΝΩ; Λύση 2: περίσσεια – ενσωματώνω παραπάνω πληροφορία στο μήνυμα – κωδικοποιώ το μήνυμα (π.χ., με κώδικα Hamming) Καλό: μικρό overhead (τουλάχιστον σε σύγκριση με την επανάληψη) Ανησυχία 1: μπορώ να εντοπίσω και να διορθώσω το πολύ 1 λάθος – αν υπάρχουν παραπάνω; Λύση 2.5: μπορώ να εντοπίσω και να διορθώσω παραπάνω από 1 λάθη με κώδικες Reed-Solomon ( staircase checksum+two-dimensional parity)… Λύση 3: καρφίτσωμα (pinpoint) ή αλλιώς διδιάστατη ισοτιμία (two-dimensional parity)
Διόρθωση και ανίχνευση σφαλμάτων στην πράξη… Οι κώδικες διόρθωσης σφαλμάτων εμφανίστηκαν στη δεκαετία του 1940 λίγο μετά την εμφάνιση των υπολογιστών για τον προφανή λόγο ότι οι πρώτοι υπολογιστές ήταν μάλλον αναξιόπιστοι και τα συστατικά τους συχνά εμφάνιζαν σφάλματα… Αλλά οι ρίζες των κωδίκων διόρθωσης σφαλμάτων ξεκινούν ακόμα πιο παλιά σε επικοινωνιακά συστήματα όπως οι τηλέγραφοι και τα τηλέφωνα οπότε δεν είναι περίεργο ότι δύο βασικά γεγονότα-κίνητρα που οδήγησαν στη δημιουργία των κωδίκων διόρθωσης σφαλμάτων συνέβησαν στα εργαστήρια της τηλεφωνικής εταιρείας Bell και μάλιστα σε 2 ερευνητές της, τους Claude Shannon και Richard Hamming…: Ο Hamming ενοχλημένος από τις δυσλειτουργίες του υπολογιστή της εταιρείας τα ΣΚ εφηύρε τους πρώτους κώδικες διόρθωσης σφαλμάτων που είναι γνωστοί ως κώδικές Hamming
Διόρθωση και ανίχνευση σφαλμάτων στην πράξη…: Θεωρία της Πληροφορίας (Shannon) Όμως οι κώδικες διόρθωσης σφαλμάτων είναι μόνο ένα μέρος μιας μεγαλύτερης επιστημονικής περιοχής που ονομάζεται Θεωρία της Πληροφορίας (Information Theory-IT) η οποία ξεκίνησε να υπάρχει (θεμελιώθηκε) το 1948 μέσω της πολύ σημαντικής δημοσιευμένης εργασίας του Claude Shannon με τίτλο “The Mathematical Theory of Communication”… Ο Shannon απέδειξε με μαθηματικά ότι ήταν δυνατόν – στη γενική περίπτωση – να επιτευχθούν εξαιρετικά ψηλά ποσοστά επικοινωνίας χωρίς σφάλματα πάνω από συνδέσμους που επηρεάζονται από θόρυβο και είναι επιρρεπείς στα σφάλματα Αρκετές δεκαετίες αργότερα οι επιστήμονες σχεδόν κατάφεραν να φτάσουν στην πράξη το θεωρητικό μέγιστο που περιέγραψε ο Shannon… O Shannon υπήρξε και συνδιοργανωτής του Συνεδρίου Τεχνητής Νοημοσύνης που έγινε στο Dartmouth το 1956 και ενεπλάκη στη θεμελίωση μιας ακόμα επιστημονικής περιοχής που καλείται Τεχνητή Νοημοσύνη Ο Shannon κατασκεύασε επίσης ένα είδος ποδηλάτου με έναν τροχό ελλειπτικού σχήματος (όχι κυκλικού) στο οποίο ο αναβάτης κινούταν πάνω-κάτω καθώς το ποδήλατο κινούταν προς τα μπροστά!
Διόρθωση και ανίχνευση σφαλμάτων στην πράξη… Η δουλειά του Shannon τοποθέτησε τους κώδικες Hamming σε ένα ευρύ θεωρητικό πλαίσιο και έθεσε τις βάσεις για σημαντική περαιτέρω πρόοδο… Οι κώδικες Hamming χρησιμοποιούνταν από τους πρώτους υπολογιστές και χρησιμοποιούνται ακόμα ευρέως σε συστήματα μνημών συγκεκριμένων τύπων Μια άλλη σημαντική οικογένεια κωδίκων είναι οι κώδικες Reed-Solomon που: μπορούν να προσαρμοστούν για να διορθώνουν μεγάλο αριθμό σφαλμάτων ανά κωδική λέξη (σε αντίθεση με τον (7,4) κώδικα Hamming που μπορεί να διορθώσει μόνον ένα λάθος σε κάθε 7-ψήφια κωδική λέξη) βασίζονται σε ένα μαθηματικό πεδίο που καλείται Άλγεβρα Πεπερασμένου Χώρου αλλά πρακτικά μπορούμε να τους φανταζόμαστε σα συνδυασμό των χαρακτηριστικών των ιδεών του κλιμακωτού αθροίσματος ελέγχου (staircase checksum) και του διδιάστατου καρφιτσώματος (two-dimensional pinpoint) χρησιμοποιούνται σε CD, DVD και σκληρούς δίσκους υπολογιστών
Διόρθωση και ανίχνευση σφαλμάτων στην πράξη… Τα αθροίσματα ελέγχου (checksums) χρησιμοποιούνται ευρέως στην πράξη κυρίως για εντοπισμό (παρά για διόρθωση) σφαλμάτων Το πιο σημαντικό παράδειγμα χρήσης τους είναι το Ethernet, το δικτυακό πρωτόκολλο που χρησιμοποιείται από (σχεδόν) κάθε υπολογιστή στον πλανήτη σήμερα…: για τον εντοπισμό σφαλμάτων το Ethernet χρησιμοποιεί checksum που καλείται CRC-32 Το πιο διαδεδομένο πρωτόκολλο internet που καλείται TCP (Transmission Control Protocol-Πρωτόκολλο Ελέγχου Μετάδοσης) επίσης χρησιμοποιεί checksums για κάθε πακέτο δεδομένων που στέλνει: πακέτα που δεν έχουν σωστά checksums απλά αγνοούνται αφού το πρωτόκολλο TCP είναι σχεδιασμένο ώστε να τα ξαναστέλνει αργότερα – αν αυτό είναι αναγκαίο Πακέτα λογισμικού που δημοσιεύονται στο internet ελέγχονται για ορθότητα με χρήση checksums Οι πιο δημοφιλείς αλγόριθμοι που χρησιμοποιούν checksums είναι οι MD5 και SHA-1, που αποτελούν κρυπτογραφικές συναρτήσεις κατακερματισμού και παρέχουν προστασία απέναντι σε κακόβουλες τροποποιήσεις λογισμικού και τυχαία επικοινωνιακά σφάλματα Τα checksums που χρησιμοποιεί ο MD5 έχουν περίπου 40 ψηφία Τα checksums που χρησιμοποιεί ο SHA-1 έχουν περίπου 50 ψηφία Υπάρχουν και πιο ανθεκτικές εκδοχές όπως ο SHA-256 (περίπου 75 ψηφία) και ο SHA- 512 (περίπου 150 ψηφία)
Διόρθωση και ανίχνευση σφαλμάτων στην πράξη… Η επιστήμη της διόρθωσης και ανίχνευσης σφαλμάτων συνεχίζει να αναπτύσσεται… Από τη δεκαετία του 1990, ιδιαίτερη προσοχή έχουν λάβει οι κώδικες ελέγχου ισοτιμίας χαμηλής πυκνότητας (low-density parity-check codes)… Οι κώδικες αυτοί χρησιμοποιούνται σε εφαρμογές όπως δορυφορική τηλεόραση και διαστημικές επικοινωνίες Οπότε την επόμενη φορά που θα απολαμβάνεται κάποιο πρόγραμμα υψηλής ευκρίνειας σε δορυφορική τηλεόραση θυμηθείτε ότι εξαιτίας της απόγνωσης του Richard Hamming με τον υπολογιστή της εταιρείας που χάλαγε τα ΣΚ μπορούμε σήμερα να απολαμβάνουμε την ψυχαγωγία του ΣΚ μας…
Σύνοψη Δεδομένο: μήνυμα προς αποθήκευση ή προς αποστολή πάνω από μη αξιόπιστο επικοινωνιακό κανάλι Ζητούμενο: εντοπισμός και – πιθανώς – διόρθωση σφαλμάτων στο λαμβανόμενο μήνυμα Ποιο είναι το (θεωρητικά) καλύτερο που μπορούμε να περιμένουμε; Shannon (1948): δυνατόν – στη γενική περίπτωση – να επιτευχθούν εξαιρετικά ψηλά ποσοστά επικοινωνίας χωρίς σφάλματα πάνω από συνδέσμους που επηρεάζονται από θόρυβο και είναι επιρρεπείς στα σφάλματα Στην πράξη…: Τρόποι εντοπισμού και διόρθωσης σφαλμάτων: Επανάληψη: επαναμετάδοση του μηνύματος Πρόβλημα: μεγάλο overhead Περίσσεια: ενσωμάτωση επιπλέον πληροφορίας στο μήνυμα – δηλ., κωδικοποίησή του – με βάση κάποιο γνωστό κώδικα διόρθωσης σφαλμάτων (π.χ., Hamming που διορθώνει 1 σφάλμα/κωδική λέξη, Reed-Solomon που διορθώνουν πολλά σφάλματα/κωδική λέξη) Προτιμάται λόγω χαμηλού overhead Καρφίτσωμα (pinpoint) – Διδιάστατη ισοτιμία (two-dimensional parity): τοποθετούμε το μήνυμα σε πλέγμα και υπολογίζουμε απλό checksum για κάθε γραμμή και στήλη Τρόποι εντοπισμού σφαλμάτων – η διόρθωση γίνεται συνήθως με αίτηση επαναμετάδοσης του μηνύματος: Σφάλματα συμβαίνουν τυχαία Απλό άθροισμα ελέγχου (simple checksum): αθροίζουμε τα ψηφία του μηνύματος και κρατάμε το τελευταίο ψηφίο του αποτελέσματος Εντοπίζεται το πολύ 1 σφάλμα Κλιμακωτό άθροισμα ελέγχου (staircase checksum): πολλαπλασιάζουμε κάθε ψηφίο του μηνύματος με τη θέση του, αθροίζουμε τα γινόμενα και κρατάμε το τελευταίο ψηφίο του αποτελέσματος Σε συνδυασμό με το απλό άθροισμα ελέγχου εντοπίζονται το πολύ 2 σφάλματα (στέλνουμε μαζί με κάθε μήνυμα και το απλό και το κλιμακωτό checksum) Σφάλματα προκαλούνται από κακόβουλο αντίπαλο (όχι τυχαία) Κρυπτογραφικές συναρτήσεις κατακερματισμού (cryptographic hash functions)
Σύνοψη Εφαρμογές που χρησιμοποιούν κώδικες (δηλ., αλγόριθμους) διόρθωσης σφαλμάτων Συστήματα μνημών συγκεκριμένου τύπου (π.χ., DRAM): κώδικες Hamming CD, DVD, HDD: περίσσεια/κωδικοποίηση, κώδικες Hamming, Reed-Solomon, διδιάστατη ισοτιμία (2D parity) / καρφίτσωμα (pinpointing)… Ethernet (δικτυακή σύνδεση υπολογιστών): checksum CRC-32 TCP (internet): κρυπτογραφικές συναρτήσεις κατακερματισμού MD5 (40-ψήφιο checksum), SHA-1 (50-ψήφιο checksum), SHA-256 (75-ψήφιο checksum), SHA-512 (150-ψήφιο checksum) Δορυφορική τηλεόραση/διαστημικές επικοινωνίες: κώδικες ελέγχου ισοτιμίας χαμηλής πυκνότητας (low-density parity-check codes)
Σύνοψη Εφαρμογές που χρησιμοποιούν κώδικες (δηλ., αλγόριθμους) διόρθωσης σφαλμάτων κώδικες Hamming περίσσεια/κωδικοποίηση, κώδικες Hamming, Reed-Solomon, διδιάστατη ισοτιμία (2D parity) / καρφίτσωμα (pinpointing)… checksum CRC-32 κρυπτογραφικές συναρτήσεις κατακερματισμού MD5 (40-ψήφιο checksum), SHA-1 (50-ψήφιο checksum), SHA-256 (75-ψήφιο checksum), SHA-512 (150-ψήφιο checksum) κώδικες ελέγχου ισοτιμίας χαμηλής πυκνότητας (low-density parity-check codes)