Folgende Procedure vertauscht in zufälliger Weise die Feldinhalte in einem Dataset.
Vorher:
Code:
1 | A1 | A2 | A3 | 10
2 | B1 | B2 | B3 | 20
3 | C1 | C2 | C3 | 30
Nachher:
Code:
1 | B1 | A2 | B3 | 10
2 | A1 | B2 | C3 | 30
3 | C1 | C2 | A3 | 20
Sinn der Sache ist, Tabellen, die dem Datenschutz unterliegen (z.B. Adressdaten) so zu vermischeln, dass danach die Daten wertlos sind.
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;