Von einer gegebenen Datenmenge lässt sich eine Prüfsumme (auch "Checksumme" genannt) erstellen. Anhand dieser Prüfsumme kann beispielsweise nach einer Übertragung dieser Datenmenge festgestellt werden, ob die Übertragung fehlerfrei gewesen ist. Ein in vielen Übertragungsprotokollen gebräuchliches mathematisches Verfahren zur Ermittlung einer solchen Prüfsumme ist CRC ("Cyclic Redundancy Check", Rest einer Polynomdivision). Eine CRC-Prüfsumme kann natürlich auch unabhängig von Datenübertragungen zur Identitätsprüfung und zum Vergleich von Datenmengen verwendet werden.
So ist etwa der Inhalt zweier Dateien identisch, wenn sie zunächst gleich groß sind und dazu jeweils die Prüfsummen über ihren Inhalt identisch sind. Sie könnten es zwar dabei belassen, die Inhalte der zu vergleichenden Dateien einfach nur in Strings einzulesen und diese direkt zu vergleichen. Die Ermittlung der Prüfsumme bietet dagegen die zusätzliche Möglichkeit, zunächst die Prüfsumme beispielsweise nur einer Datei zu ermitteln und zu speichern. Den gespeicherten Wert können Sie zu einem späteren Zeitpunkt mit der Prüfsumme einer anderen oder sogar derselben Datei zu vergleichen. Auf diese Weise können Sie feststellen, ob eine Datei nachträglich verändert worden ist, etwa durch Virus-Befall. Allerdings mag es derart intelligente Viren geben, die durch Anpassung von ein paar ihrer eigenen Bytes dafür sorgen, dass die ursprüngliche Prüfsumme wieder stimmt. Völlige Sicherheit vor Viren-Befall ist mit einer CRC-Prüfsumme alleine kaum zu gewährleisten.
Auch wenn sich "Rest einer Polynomdivision" erschreckend kompliziert anhören mag - eine Funktion, die eine 32-Bit-Prüfsumme (CRC-32) ermittelt, ist dennoch recht klein und sieht gar nicht mal so kompliziert aus:
Public Function CRC32(Str As String) As Long
Dim i As Long
Dim j As Long
Dim nPowers(0 To 7) As Integer
Dim nCRC As Long
Dim nByte As Integer
Dim nBit As Boolean
For i = 0 To 7
nPowers(i) = 2 ^ i
Next 'i
For i = 1 To Len(Str)
nByte = Asc(Mid$(Str, i, 1))
For j = 7 To 0 Step -1
nBit = CBool((nCRC And 32768) = 32768) Xor _
((nByte And nPowers(j)) = nPowers(j))
nCRC = (nCRC And 32767&) * 2&
If nBit Then
nCRC = nCRC Xor &H8005&
End If
Next 'j
Next 'i
CRC32 = nCRC
End Function
|