Hi,
Wie mach ich den so eine IP-Überprüfung, die vor dem Abschicken
prüft, ob diese IP-Adresse schon einmal einen Datensatz
eingepflegt hat oder nicht?Vorher ein entsprechendes SELECT abfeuern oder die Spalte auf UNIQUE
setzen.
Da Datenbankabfragen teuer sind, würde ich evt. einen Bloomfilter zwischenschalten.
Eine Beschreibung mit Beispielen für Perl gibt's hier:
http://www.perl.com/pub/a/2004/04/08/bloom_filters.html (Das sind _zwei_ Seiten! Falls jemand genauso schusselig/kurzsichtig ist, wie ich und den kleinen Hinweis am Ende übersieht ;-)
Als Hashfunktion wird da aber SHA vorgeschlagen, das finde ich etwas aufwendig. Je nach Menge reicht da auch MD5 oder, bei sorgfältiger Wahl des Polynoms, läßt sich auch ein ein CRC passender Größe mißbrauchen.
Schlußendlich dürfte wahrscheinlich sogar simples polynomiales Hashing (wahrscheinlich besser als "addierendes Hashing" bekannt, was aber nicht ganz korrekt ist). Falls sich keiner erinnert (ja, lang ist's her, was? ;-) hier noch ein Beispiel in C (mehr oder weniger kackfrech geklaut von Kernighan&Ritchie):
#define HASH_CONSTANT 31
int hash(char *s, size_t len){
int hash = 0;
char *t = NULL;
if(len <= 0 || !*s){
/*Don't forget to set errno appropriatly!*/
return -1;
}
t = s;
while(len--){
hash = hash * HASH_CONSTANT + *t++;
}
return (hash & INT_MAX);
}
(Integergrößen sind natürlich anzupassen!)
Günstige Werte für HASH_CONSTANT sind neben der 31 auch 33 (recht guter Wert für indogermanische Sprachen in 8 Bit Zeichencodierungen; wird auch von der Bercley DB benutzt), 37 oder 131. Die Mathematik dahinter ist relativ kompliziert und auch für das Aussuchen eher unnötig, da einfaches Ausprobieren hier genauso gut, wenn nicht sogar noch besser funktioniert.
Bei rotierendem Hashing, das etas schneller wäre, da die Mutiplikation rausfällt, ist die Auswahl an verschiedenen Werten leider zu gering, als das man es für eien Bloomfiletr nutzen könnte.
so short
Christoph Zurnieden