Generieren einer hash-Summe für mehrere Ganzzahlen

Stehe ich vor dem problem, dass mehrere ganze zahlen, und ich habe zu generieren mit Ihnen. Zum Beispiel.

Int 1: 14
Int 2: 4
Int 3: 8
Int 4: 4

Hash Sum: 43

Habe ich einige Einschränkung in der Werte, der höchste Wert, und das Attribut haben kann, ist 30, die addition aller von Ihnen ist immer 30. Und die Attribute sind immer positiv.

Der Schlüssel ist, dass ich möchte, zu generieren, die denselben hash-Summe für ähnliche zahlen, zum Beispiel, wenn ich die ganzen zahlen, 14, 4, 10, 2 soll ich dann zu erzeugen, die denselben hash-Summe, in dem Fall oben 43. Aber natürlich, wenn die zahlen sind sehr unterschiedlich (4, 4, 2, 20), dann hätte ich einen anderen hash-Summe. Es muss auch schnell sein.

Idealerweise möchte ich, dass die Ausgabe der hash-Summe liegt zwischen 0 und 512, und es sollte gleichmäßig verteilt. Mit meinen Einschränkungen die ich haben kann, um 5K verschiedene Möglichkeiten, also das, was ich haben möchte, ist um 10 pro Eimer.

Ich bin sicher, es gibt viele algorithmen, die dies tun, aber ich konnte nicht einen Weg finden, googeln dieses Ding. Kann jemand bitte posten Sie einen Algorithmus, um dies zu tun?.

Einige weitere Informationen

Die ganze Sache mit diesem ist, dass diese ganzen zahlen sind Attribute, die für eine Funktion. Ich will um die Werte zu speichern der Funktion in einer Tabelle, aber ich habe nicht genug Speicher zum speichern der verschiedenen Optionen. Das ist, warum ich generalisieren wollen, auf zwischen ähnlichen Parametern.

Der Grund, warum es 10, 5, 15 sind völlig Verschieden von 5, 10, 15, es ist, weil wenn Sie sich vorstellen, diese in 3d dann beide Punkte sind eine ganz andere Stelle

Einige weitere Informationen 2

Einige Antworten versuchen zu lösen das problem mit der Vermischung. Aber ich denke, das ist nicht so Komplex. Dank der Kommentare habe ich realisiert, dass dies ein clustering-Algorithmus problem. Wenn wir nur 3 Attribute und stellen wir uns vor, das problem in 3d, was ich nur brauche ist, teilen den Raum in Blöcke.

In der Tat das Problem kann mit Regeln dieser Art

if (att[0] < 5 && att[1] < 5 && att[2] < 5 && att[3] < 5)
     Block = 21


if ( (5 < att[0] < 10) &&  (5 < att[1] < 10) &&  (5 < att[2] < 10) &&  (5 < att[3] < 10))
     Block = 45

Das problem ist, dass ich brauche eine schnelle und eine Allgemeine Art und Weise zu erzeugen, die ifs-ich kann nicht schreiben Sie alle Möglichkeiten.

  • Sie wollen also eine schlechte hash-Funktion? (high-Kollision, nicht-gleichmäßige Verteilung)
  • Ich weiß nicht, wie die Verwendung einer hash-Funktion in mein problem. Für die hash-Funktion brauche ich nur einen Eingang und ich habe 4.
  • Ryan ist richtig, was Sie beschreiben, ist schlechte Eingabe für eine hash-Funktion. Sollten Sie beschreiben Ihr problem, nicht eine Lösung, die Sie wissen, funktioniert nicht.
  • Ich weiß immer noch nicht, warum dies ist eine schlechte Eingabe für eine hash-Funktion, können Sie definieren, was schlecht ist Eingabe für eine hash-Funktion?
  • Als Eddie sagt, eine hash-Funktion sollte die "Rückkehr eine Anzahl gleichmäßig über die mögliche Werte"; angesichts ähnlicher zahlen sollte es zu unterschiedlichen Ausgang. Das ist der Zweck. Was Sie beschreiben, ist das Gegenteil.
  • Clustering ähnliche Werte wäre einfach genug, wenn Sie könnten geclustert werden, um pre-definierten einrastpunkte. Sie scheinen zu wollen, dass dynamische snap-Punkte, die müssen wissen, alle anderen Werte.
  • Graham, du hast Recht, das ist genau das gleiche als clustering. Kannst du dies als eine Antwort, mehr zugänglich für andere Benutzer in der Zukunft. Wenn Sie Erfahrung in der cluster-können Sie bitte empfehlen eine Entfernung Messen-Funktion, in der Tat brauche ich nur, die.
  • Kennen Sie alle die Werte, die vor der Zeit? Eine distanzfunktion wird nicht viel helfen, wenn Sie nicht Feste Werte haben, zu Messen. Könnten Sie vielleicht auch mehr Informationen bieten, auf das, was die input-und output-zahlen darstellen? Ich aktualisiert meine Antwort basiert auf Vermutungen.
  • Hatten Sie Glück auf der Suche nach einer Lösung? Ich bin auch zu lösen versucht eine ähnliche Frage. In meinem Fall habe ich eine Reihe von zahlen in verschiedenen Formen (z.B. eine Reihe von zahlen in die Milliarden, der andere ist in Millionen. Man ist in Kilometer, der andere ist in Meilen. Die eine ist, die aus einem Wikipedia-Tabelle, die andere aus einer anderen Quelle. Jedoch alle das gleiche Konzept darstellen. Zum Beispiel das BIP der Länder.) Ich brauche eine sehr robuste Technik, die erfassen können, die "Semantik" von einer Reihe von zahlen und entscheiden, ob Sie ähnlich sind.

Schreibe einen Kommentar