Kann man Hash-Kombinationen erkennen und ausnutzen?
Verfasst: 23.12.2023, 22:06
Hi!
Mir kam gerade die vage Ahnung einer Idee, die ich gerne mal mit euch teilen will.
Ich habe Dreiecke. Dreiecke haben drei Positionen. Ich kann zu einer Position XYZ einen Hash bilden, indem ich (zum Beispiel) jeden Wert in den Bereich +-32'767.0f transformiere und den Integer davon mit irgendner Primzahl multipliziere, um die Information über die kompletten z.B. 32Bit Hashwert breitzuschmieren. Dann XOR der drei, oder auch noch bissl Rot und Mult, und ich habe einen halbwegs tauglichen Hash für eine 3D-Position.
Wenn ich jetzt plump die Hashes der beiden Endpunkte XORe, hab ich den Hash einer Kante. Ok, die hau ich jetzt in ne std::unordered_map und hab mit drei Lookups alle Nachbarn eines Dreiecks. Ich hab jetzt keine Idee, wie eine unordered_map Map implementiert ist, aber wenn ich Zeit und Lust hab, schlug xq vor, könne ich ja eine auf Basis von Cuckoo Filters implementieren. Hm. Schaumermal.
Die eigentliche Frage ist jetzt aber: ich kann jetzt auch einen Hash von einem Dreieck bilden, indem ich die Hashes der drei Eckpunkte verXORe. Benachbarte Dreiecke haben jetzt zwei von drei Hashes in dieser Kombi identisch. Kann ich das irgendwie ausnutzen? Gibt es irgendnen coolen Trick, wie ich ausgehend von einem Hash erkenne, welche Hashes daraus gebildet wurden? Könnte ich meine Einzel-Hashes eines Eckpunkts irgendwie poisonen, so dass ich von nem 2-Hash ausgehend erkenne, ob ein anderes Element mit diesem 2-Hash und einen zusätzlichen dritten Element gebildet wurde?
Je länger ich darüber nachdenke, desto mehr stelle ich fest, dass mir die reine Erkennung, ob zwei Hashes einen ähnlichen Stamm haben, gar nix bringt. Ich müsste ja trotzdem jeden mit jedem Eintrag vergleichen. Wahrscheinlich komme ich wirklich besser, wenn ich einfach jede Kante in ne HashMap schmeiße und pro Nachbar halt drei Lookups mache.
Mir kam gerade die vage Ahnung einer Idee, die ich gerne mal mit euch teilen will.
Ich habe Dreiecke. Dreiecke haben drei Positionen. Ich kann zu einer Position XYZ einen Hash bilden, indem ich (zum Beispiel) jeden Wert in den Bereich +-32'767.0f transformiere und den Integer davon mit irgendner Primzahl multipliziere, um die Information über die kompletten z.B. 32Bit Hashwert breitzuschmieren. Dann XOR der drei, oder auch noch bissl Rot und Mult, und ich habe einen halbwegs tauglichen Hash für eine 3D-Position.
Wenn ich jetzt plump die Hashes der beiden Endpunkte XORe, hab ich den Hash einer Kante. Ok, die hau ich jetzt in ne std::unordered_map und hab mit drei Lookups alle Nachbarn eines Dreiecks. Ich hab jetzt keine Idee, wie eine unordered_map Map implementiert ist, aber wenn ich Zeit und Lust hab, schlug xq vor, könne ich ja eine auf Basis von Cuckoo Filters implementieren. Hm. Schaumermal.
Die eigentliche Frage ist jetzt aber: ich kann jetzt auch einen Hash von einem Dreieck bilden, indem ich die Hashes der drei Eckpunkte verXORe. Benachbarte Dreiecke haben jetzt zwei von drei Hashes in dieser Kombi identisch. Kann ich das irgendwie ausnutzen? Gibt es irgendnen coolen Trick, wie ich ausgehend von einem Hash erkenne, welche Hashes daraus gebildet wurden? Könnte ich meine Einzel-Hashes eines Eckpunkts irgendwie poisonen, so dass ich von nem 2-Hash ausgehend erkenne, ob ein anderes Element mit diesem 2-Hash und einen zusätzlichen dritten Element gebildet wurde?
Je länger ich darüber nachdenke, desto mehr stelle ich fest, dass mir die reine Erkennung, ob zwei Hashes einen ähnlichen Stamm haben, gar nix bringt. Ich müsste ja trotzdem jeden mit jedem Eintrag vergleichen. Wahrscheinlich komme ich wirklich besser, wenn ich einfach jede Kante in ne HashMap schmeiße und pro Nachbar halt drei Lookups mache.