Hash eines Datensatzes

Hash eines Datensatzes

am 30.01.2007 12:05:08 von Stefan+Usenet

Hallo,

ich benoetige (zur Sammlung identischer Adressdaten) einen Hashwert
ueber jeweils einen kompletten Datensatz (i.e. die Daten kommen
automatisiert in die Datenbank, werden dort aber einfach nur als
Text fuer Name, Strasse, usw gespeichert; ich moechte nun Saetze mit
identischen Daten buendeln, mir dazu aber nach Moeglichkeit die
explizite Nennung aller Stringfelder ersparen, zumal die Feldliste
spaeter vielleicht auch noch erweitert werden koennte und das dann
eine potentielle Fehlerquelle mehr ist).

Die einzige Variante, die mir ohne Nennung der einzelnen Spalten
bislang einfaellt, ist ein "SELECT * FROM address WHERE ...", sowie
anschliessendes Iterieren ueber alle Felder des Ergebnisvektors in
der Applikation, sowie Bilden des Hashwerts - nur maessig elegant.

Netter waere etwas, das sinngemaess wie "SELECT SHA1(*) FROM ..."
funktioniert, bloss ist mir eine derartige Funktion nicht bekannt.

Gibt es denn irgendetwas in dieser Richtung?

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Stefan darf mehr als Laune machen!
(Sloganizer)

Re: Hash eines Datensatzes

am 30.01.2007 12:14:48 von Christian Kirsch

Am 30.01.2007 12:05 schrieb Stefan Froehlich:
> Hallo,
>
> ich benoetige (zur Sammlung identischer Adressdaten) einen Hashwert
> ueber jeweils einen kompletten Datensatz (i.e. die Daten kommen
> automatisiert in die Datenbank, werden dort aber einfach nur als
> Text fuer Name, Strasse, usw gespeichert; ich moechte nun Saetze mit
> identischen Daten buendeln,

"identische Daten"? Ist denn die "Bismarckstraße 5" dasselbe wie die
"Bismarkstr. 5" oder die "BIsmarckstr.5"?

> mir dazu aber nach Moeglichkeit die
> explizite Nennung aller Stringfelder ersparen, zumal die Feldliste
> spaeter vielleicht auch noch erweitert werden koennte und das dann
> eine potentielle Fehlerquelle mehr ist).

Du möchtest also zwangsläufig über alle Felder vergleichen, und nur
wenn der Inhalt von allen identisch ist, willst Du sie "bündeln"?
>
> Die einzige Variante, die mir ohne Nennung der einzelnen Spalten
> bislang einfaellt, ist ein "SELECT * FROM address WHERE ...", sowie
> anschliessendes Iterieren ueber alle Felder des Ergebnisvektors in
> der Applikation, sowie Bilden des Hashwerts - nur maessig elegant.

Und unzweckmäßig, aus den erwähnten Gründen.

>
> Netter waere etwas, das sinngemaess wie "SELECT SHA1(*) FROM ..."
> funktioniert, bloss ist mir eine derartige Funktion nicht bekannt.
M.E. solltest Du in eine ganz andere Richtung suchen. Nach meiner
Erfahrung passieren die meisten Fehler bei der *Eingabe* der Daten. Da
schreibt einer "Franz Mayer", der nächste "F. Mayer" und der dritte
"Franz Meyer". Zur Adresse s.o. Ich benutze deshalb in erster Linie
die Postleitzahl (bei fünf Ziffern vertippen sich die Leuten nicht so
oft ;-), dann die Anfangsbuchstaben des Namens und der Straße.

Zu Deiner Frage: Das kannst Du z.B. mit einer Stored Procedure lösen,
die aus dem Information schema alle Spalten der Tabelle rausfischt,
alle Werte eines Datensatzes als String rausholt und den dann durch
SHA1 oder MD5 pustet.

Re: Hash eines Datensatzes

am 30.01.2007 12:21:28 von Stefan+Usenet

On Tue, 30 Jan 2007 12:14:48 +0100 Christian Kirsch wrote:
> > [Adressdaten] werden dort aber einfach nur als Text fuer Name,
> > Strasse, usw gespeichert; ich moechte nun Saetze mit identischen
> > Daten buendeln,

> "identische Daten"? Ist denn die "Bismarckstraße 5" dasselbe wie
> die "Bismarkstr. 5" oder die "BIsmarckstr.5"?

Nein. (Also natuerlich schon, aber das waere dann Pech des
Anwenders). In der Praxis wird das selten bis nicht vorkommen,
weil der ueberwiegende Teil der Adressen ohnehin irgendwo anders
aus einem festen Datenbestand uebernommen wird - manuelle
Aenderungen sind zwar moeglich, dann aber in 99% der Faelle auch
mit einer realen Aenderung der Adresse verbunden.

Im Prinzip koennte man auch sagen, ich suche einen Weg, die Daten
nachtraeglich zu normalisieren. Es kam halt frueher niemand auf die
Idee, dass das bei Lieferanschriften auf Bestellungen ueberhaupt
jemals eine gute Sache sein koennte.

> Du möchtest also zwangsläufig über alle Felder vergleichen, und
> nur wenn der Inhalt von allen identisch ist, willst Du sie
> "bündeln"?

Exakt, ja.

> M.E. solltest Du in eine ganz andere Richtung suchen. Nach meiner
> Erfahrung passieren die meisten Fehler bei der *Eingabe* der
> Daten.

Das ist bekannt und erwogen :-)

> Zu Deiner Frage: Das kannst Du z.B. mit einer Stored Procedure
> lösen, die aus dem Information schema alle Spalten der Tabelle
> rausfischt, alle Werte eines Datensatzes als String rausholt und
> den dann durch SHA1 oder MD5 pustet.

Merci, werde ich mir einmal angucken. Stored procedures habe ich
bislang noch nie verwendet.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Stefan: die wilde Verführung!
(Sloganizer)

Re: Hash eines Datensatzes

am 01.02.2007 09:10:56 von sk

Stefan Froehlich schrieb:

> Netter waere etwas, das sinngemaess wie "SELECT SHA1(*) FROM ..."
> funktioniert, bloss ist mir eine derartige Funktion nicht bekannt.
>
> Gibt es denn irgendetwas in dieser Richtung?

SELECT sha1( concat( adr, plz, ort ) ) FROM ...

Die Felder natürlich nach deiner Wahl.

Jörg