1) Kann ich für den Zweck einer wirklich niedrigen Hash-Kollision mit nur der Hälfte der 128 Bits eines sha1 davonkommen, anstatt sich mit dem sha1 selbst zu beschäftigen? Ich verstehe, dass dies nicht für kryptographische Hashes geeignet ist, aber ich brauche nur die Hashes für Hash-Tabellenschlüssel.OK, nur 64-Bit-sha1-Hash als ID zu verwenden?
2) Rechenzeit ist keine Priorität, und außerdem hashing ich sehr kleine Daten. Insbesondere werde ich hauptsächlich 2 oder 3 64-Bit-Hashes nehmen und sie hashen, um einen weiteren 64-Bit-Hash zu bekommen. Gibt es zu diesem Zweck eine bessere Option als sha1? Auch hier sollten Kollisionen sehr unwahrscheinlich sein.
3) Ich bin ein sql newb. Ist es eine gute Idee, 64-Bit-Hashes als IDs in SQL zu verwenden? Werden 64-Bit-IDs Leistungsprobleme in SQLite oder Postgres verursachen? Ich werde Daten über mehrere Datenbanken hinweg koordinieren müssen (einschließlich eines Lucene-Indexes), also dachte ich, ich sollte Hashes direkt in den Tabellen behandeln, anstatt sich mit automatisch inkrementierten IDs zu beschäftigen (was nur in einer db sinnvoll wäre) über alle Datenspeicher hinweg). Ich denke, 64-Bit ist ein guter Kompromiss: groß genug für unwahrscheinliche Kollisionen, spart aber Platz (und Nachschlagezeit?).
4) Was ist mit CRC-64? Produziert das eine zufällig genug Verteilung?
Ich denke, GUID/UUID ist ziemlich genau das, was ich will. Ich bin mir nicht sicher, ob die sqlite-Unterstützung angemessen ist, also werde ich das untersuchen. Wie gesagt, ich bin ein sql newb. – Jegschemesch
Sqlite3 kann einfach erweitert werden, um UUIDs zu unterstützen, und ich habe es bereits erfolgreich in einer iPhone App gemacht. –
Ich stimme dieser Antwort zu. Ich habe eine Tabelle mit Millionen von Millionen von Zeilen gefüllt und verwenden Sie die ersten 64 Bit als unsgined Integer-Schlüssel anstelle eines sha1 Hash als String aus Gründen der Leistung. Mit 350 Millionen Zeilen hatte ich einige Kollisionen mit 56 Bit. Ich kombiniere immer den 64-Bit-Hash-Schlüssel mit seinem Datum, so dass Hashschlüssel und Datum übereinstimmen müssen. Mit dieser Methode habe ich nur 30 Millionen Zeilen pro Tag, die zu Kollisionen führen können, was die Chance auf lange Sicht erheblich reduziert. Eine Kollision würde zu einem einzigen Informationsfrieden führen - in meinem Fall ist das die Ersparnis wert. – bhelm