![]() |
Dataset Scrambler
Folgende Procedure vertauscht in zufälliger Weise die Feldinhalte in einem Dataset.
Vorher:
Code:
Nachher:
1 | A1 | A2 | A3 | 10
2 | B1 | B2 | B3 | 20 3 | C1 | C2 | C3 | 30
Code:
Sinn der Sache ist, Tabellen, die dem Datenschutz unterliegen (z.B. Adressdaten) so zu vermischeln, dass danach die Daten wertlos sind.
1 | B1 | A2 | B3 | 10
2 | A1 | B2 | C3 | 30 3 | C1 | C2 | A3 | 20 Danach können die Daten z.B. an den Enwickler einer Datenbankanwendung gegeben werden, damit dieser mit Kundendaten testen kann. Der Algorithmus hat bisher nur eine Reichweite von einem Datensatz; d.h. es werden nur Daten zwischen aufeinanderfolgenden Datensätzen vertauscht.
Delphi-Quellcode:
{**************************************************************************
* NAME: ScrambleDataset * DESC: zufälliges Vertauschen vor Feldern innerhalb eines Datasets *************************************************************************} procedure ScrambleDataset(ds: TDataSet); var Data, Data2 : array of Variant; i : Integer; swapit, swapmask: array of Boolean; begin Assert(Assigned(ds)); SetLength(Data, ds.FieldCount); SetLength(Data2, ds.FieldCount); SetLength(swapit, ds.FieldCount); SetLength(swapmask, ds.FieldCount); ds.First; for i := 0 to ds.FieldCount-1 do begin // problematische Feldtypen ausschliesen swapmask[i] := not (ds.Fields[i].DataType in [ftUnknown, ftAutoInc, ftBlob, ftMemo,ftGraphic, ftArray, ftDataSet]); // Felder, die einen "Tag" haben ausschliesen // das wären z.B. Primärschlüsselfelder if ds.fields[i].Tag > 0 then swapmask[i] := False; end; while not ds.Eof do begin // welche Felder sollen vertauscht werden for i:= 0 to ds.FieldCount-1 do swapit[i] := swapmask[i] and (random > 0.5); for i:= 0 to ds.FieldCount-1 do begin if swapit[i] then Data[i] := ds.Fields[i].Value; end; ds.Next; if ds.Eof then Exit; for i:= 0 to ds.FieldCount-1 do begin if swapit[i] then Data2[i] := ds.Fields[i].Value; end; ds.Edit; for i:= 0 to ds.FieldCount-1 do begin if swapit[i] then ds.Fields[i].Value := Data[i]; end; ds.Post; ds.Prior; // zurück auf vorherigen Datensatz ds.Edit; for i:= 0 to ds.FieldCount-1 do begin if swapit[i] then ds.Fields[i].Value := Data2[i]; end; ds.Post; ds.Next; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz