ich speichere 8-Zeichen-MD5-Hashes in zwei Tabellen (Text-Felder) und wenn ich mir danach mit nem Database Browser die DB anschaue, finde ich unter plötzlich im betreffenden Feld unter vielen normalen Werte auch Werte wie "50597000000000", "325086000000000" oder "NaN".
Es hat definitiv etwas mit der DB zu, in Python stimmen die Werte.
con = sqlite3.connect(db)
cur = con.cursor()
for book in books:
cur.execute("insert into books(md5_hash, isbn) values \
(?, ?)", (book.hash, book.isbn))
cur.execute("insert into stats(md5_hash, date_entered) values \
(?, ?)", (book.hash, today))
con.commit()
alan hat geschrieben:ich speichere 8-Zeichen-MD5-Hashes in zwei Tabellen (Text-Felder) und wenn ich mir danach mit nem Database Browser die DB anschaue, finde ich unter plötzlich im betreffenden Feld unter vielen normalen Werte auch Werte wie "50597000000000", "325086000000000" oder "NaN".
Hallo alan!
TEXT-Felder --> TEXT-Daten (UTF-8-codiert oder Unicode).
Kümmere dich darum, dass diese "Hash"-Werte (wie auch immer du es schaffst an diese 8-Byte-Werte zu kommen) auch wirklich Text (UTF-8-codiert) oder Unicode sind, bevor du sie in die SQLite-Datenbank schreibst. Dann sollte alles normal laufen.
alan hat geschrieben:Die Daten sind schon richtig in der DB, nur der sqlitebrowser hat nen Bug und zeigt sie nicht richtig an.
Hallo alan!
Ich kann mir kaum vorstellen, dass der SQLite-Browser nicht mit reinem ASCII klar kommt. Und wenn es kein TEXT ist, dann ist es als Primärschlüssel sowiso ungeeignet. Außerdem würde ich niemals nur 8 Byte vom MD5-(Hex)digest nehmen. Die Gefahr, dass es doch einen doppelten Schlüssel gibt, wäre mir einfach zu hoch. Nimm doch den kompletten MD5-Hexdigest. Dann hast du einen schönen String, der sich leicht indizieren lässt und kein Binär-Irgendetwas.
gerold hat geschrieben:Außerdem würde ich niemals nur 8 Byte vom MD5-(Hex)digest nehmen. Die Gefahr, dass es doch einen doppelten Schlüssel gibt, wäre mir einfach zu hoch. Nimm doch den kompletten MD5-Hexdigest. Dann hast du einen schönen String, der sich leicht indizieren lässt und kein Binär-Irgendetwas.
Das kam mir ziemlich unwahrscheinlich vor..aber du hast Recht.
Ähm, das ist kein Hash sondern irgendein Zufallswert würde ich mal sagen. Ein Hashwert gehört zu einem Objekt und eine Hashfunktion gibt für das gleiche Objekt immer den gleichen Hashwert zurück.
Was Du da mit der Funktion machst geht einfacher ohne MD5:
Die Gefahr besteht, daran ändert aber `md5` auf Zufallszahlen angewendet nichts.
Wenn Du die Zeit, möglichst genau, plus einer Zufallszahl direkt nimmst sind die Chancen einer Kollision geringer als wenn Du das noch einmal durch `md5` jagst.
Beispiel: Mal angenommen die Zeit alleine wäre so hochaufgelöst, das es nie Kollisionen gäbe. Das wäre perfekt. Wenn Du jetzt auf diese perfekten Zeiten `md5` anwendest, besteht eine geringe Chance das zwei Zeiten den selben Hashwert ergeben. Also hast Du die Situation mit `md5` *verschlechtert*.
BlackJack hat geschrieben:
Beispiel: Mal angenommen die Zeit alleine wäre so hochaufgelöst, das es nie Kollisionen gäbe. Das wäre perfekt. Wenn Du jetzt auf diese perfekten Zeiten `md5` anwendest, besteht eine geringe Chance das zwei Zeiten den selben Hashwert ergeben. Also hast Du die Situation mit `md5` *verschlechtert*.