Offline Hash-Lookup mit 55 Mio. Datensätzen – wie löst man das ohne Datenbank?

Hallo zusammen,

ich stehe aktuell vor einer Herausforderung, bei der ich hoffe, dass mir jemand aus der Community weiterhelfen kann.

Für ein berufliches Projekt habe ich eine offlinefähige HTML-Seite mit einer eingebetteten Datenstruktur entwickelt. Ziel ist es, Kennziffern zu speichern und daraus mittels eines Hash-Verfahrens nicht umkehrbare Output-Werte zu generieren. Beispiel:

Eingabe (Kennziffer): 9000

Ausgabe (gehashter Wert): 14194901194611390735

Die Hashing-Methode ist bewusst so gewählt, dass keine Rückrechnung möglich ist. Soweit funktioniert alles.

⚠️ Das Problem

Die Suche innerhalb der Seite funktioniert aktuell nur über die ursprüngliche Kennziffer. Das Problem ist: der Nutzer kennt in der Praxis nur den Output-Wert, z. B. 14194901194611390735, und möchte wissen, welche Kennziffer dahintersteckt. Da der Hash nicht umkehrbar ist, ist ein direkter Lookup aktuell nur auf der aktiven Seite mit den angezeigten Daten möglich.

  • Und genau hier liegt der Haken:
  • Ich habe 55 Millionen solcher Kennziffern
  • Pro HTML-Seite werden 500 Datensätze generiert
  • Das ergibt über 110.000 Seiten

Es gibt keine zentrale Datenbank zur Suche, weil aus Speicher- und Performancegründen alles offline und möglichst klein gehalten werden soll

🔒 Einschränkungen

Das gesamte Projekt (HTML, CSS, JavaScript + Datenstruktur) soll offline lauffähig und unter 100 MB bleiben

Der Einsatz eines Server-Backends oder großer Datenbanken (>5 GB) ist nicht möglich oder gewünscht

Die Datenstruktur wächst jährlich um mehrere Millionen Datensätze

🤔 Was ich bisher versucht habe

Ich habe überlegt, beim Laden jeder Seite 500 neue Kennziffern zu erzeugen und deren gehashte Outputs direkt clientseitig berechnen zu lassen. Das funktioniert gut für die Anzeige – aber nicht für die Suche nach einem bestimmten Output-Wert.

Eine umgekehrte Hash-Suche ist natürlich ausgeschlossen, da das Verfahren absichtlich keine Rückwärtsauflösung erlaubt.

❓Meine Frage

Gibt es eine effiziente Möglichkeit, mit der ein Nutzer bei Eingabe eines Output-Werts wie 14194901194611390735 die zugehörige Kennziffer offline ermitteln kann – ohne dass ich eine vollständige Datenbank mit allen 55 Millionen Hash-Paaren speichern oder laden muss?

Mir ist klar, dass eine vollständige Map (Kennziffer → Hash) dafür nötig wäre – aber gibt es ggf. ein smarteres Vorgehen wie:

  • Bloomfilter mit Rückverweis?
  • Gezielte Partitionierung?
  • Hash-Index mit gezieltem Zugriff?

Ich bin für jeden technischen Denkanstoß oder Lösungsansatz offen – auch gerne minimalistische Kompressionsverfahren oder Lookup-Strategien.

Vielen Dank im Voraus für jede Unterstützung! Ich tüftele jetzt seit Tagen an diesem Ding und komme nicht weiter.

Hier nur ein Beispiel, wie die Kennziffern und deren Ergebnisse aussehen:

  • 9000     | 14194901194611390735
  • 9001     | 1420772774969051074
  • 9002     | 16576014318843989704
...zum Beitrag

Wenn die "Hash" Werte sortiert sind sollte die suche nach dem richtigen Wert doch fix gehen. Eine DB legt deshalb ja auch einen Index an.

...zur Antwort

Nein, da die Zugnuumer ja nicht der Zugnummer in der Reservierung entspricht.

...zur Antwort

DIe Bahn beschafft doch gerade die ICE-L. Mach einer Kenntnis beschafft die Bahn dafür auch Diesel Traktion. Also wirde es in den kommenden Jahren wieder solch ein Angebot geben. Übrigens Lindau wird von München aus mit elektrischen Schnellzügen angefahren!

...zur Antwort

Wenn du nen Fahrrad dabei hast dann fahre doch damit die ~35 km, wenn du eh im Urlaub radfahren willst, dann fang doch damit an.

...zur Antwort

Ich hab meine erste mit 13 im Ferienlager mit nen paar Mädels „geraucht“. War mega aufgeregt und neugierig. Hab die ersten aber nicht auf Lunge hinbekommen.

...zur Antwort

Hier der Lageplan und da wo halt Bus eingezeichnet ist wird er wohl abfahren.

https://www.bahnhof.de/downloads/station-plans/4952.pdf

...zur Antwort

Ein Zug hat immer (nur) einen Zugführer. Wir ein Zug geteilt, dann sind es zwei Züge also für jenden ein Zugführer und bei Vereinigung dann ist es ab da auch nur einer auf dem Zug.

...zur Antwort

Von was für Problemen sprichst du denn? Wenn dir die Bahn kein durchgehendes Ticket verkauft, dann sind die Fahrgastrechte meiner Meinung nach entsprechend der ausgestellten Tickets. Die Bahn gibt ja auch nicht die Garantie, dass man für jede Verbindung Spartickets kaufen kann. Wenn du dich für diese günstigeren Tickets entscheidest, dann erkauft man sich das eben mit der geringeren Flexibilität, die diese Ticket mit sich bringen.

...zur Antwort
JQuery Code umschreiben value "1" und value "2"?

Kann man den Code so umschreiben oder ändern, dass wenn man zurück auf keine_dieser_Krankheiten anklickt, dass dann alle Felder _Erkrankungen den value "1" zurück bekommen?

$(document).ready(function() {
  let krankheitenCheckboxes = $("input[type='checkbox'][name$='_Erkrankungen']").not("#keine_dieser_Krankheiten");
  let keineCheckbox = $("#keine_dieser_Krankheiten");
  
  function updateValues() {
    krankheitenCheckboxes.each(function() {
      let hiddenInput = $("input[type='hidden'][name$='_Erkrankungen']");
      if ($(this).prop("checked")) {
        hiddenInput.val("2");
      } else {
        hiddenInput.val("1");
      }
    });
  }
  
  krankheitenCheckboxes.on("change", function() {
    if ($(this).prop("checked")) {
      keineCheckbox.prop("checked", false);
      $("input[type='hidden'][name='keine_dieser_Krankheiten']").val("1");
    }
    updateValues();
  });
  
  keineCheckbox.on("change", function() {
    if (keineCheckbox.prop("checked")) {
      // Setzt alle _Erkrankungen Felder auf "1"
      krankheitenCheckboxes.each(function() {
        $(this).prop("checked", false);
        let hiddenInput = $("input[type='hidden'][name$='_Erkrankungen']");
        hiddenInput.val("1");
      });
      $("input[type='hidden'][name='keine_dieser_Krankheiten']").val("2");
    } else {
      $("input[type='hidden'][name='keine_dieser_Krankheiten']").val("1");
    }
    updateValues();
  });
  
  updateValues();
});
...zum Beitrag

Das UserInterface was du da bauen willst ist nicht logisch! Checkboxen sind dazu da 0-n Optionen auszuwählen. Bei dir schließen sich die Optionen ja teilweise gegenseitig aus siehe "keine dieser Krankheiten".

Lasse diese letzte Option doch einfach weg und stelle mit der Beschriftung sicher, dass der Nutzer zweifelsfrei weiß, welche Angabe(n) von Ihm erwartet werden!

...zur Antwort

Wann hast du denn die Kündigung "geschrieben"? Wenn es vor dem 10. war dann wende dich halt an den Anbieter und teile denen mit, dass du dich bei der Datumsangabe geirrt hast. Wenn es danach war, dann kannst du jetzt ganz normal zu Ende April kündigen.

...zur Antwort