Erstellen einer eindeutigen ganzen Zahl aus 3 verschiedenen Zahlen (1 Oracle Long, 1 Date Field, 1 Short)

8

Die Sache ist, dass die erste Nummer bereits ORACLE LONG ist, zweitens ein Date (SQL DATE, keine Zeitstempelinfo extra), wobei letzterer ein Short-Wert im Bereich 1000-100'000 ist.
Wie kann ich eine Art Hash-Wert erstellen, der für jede Kombination optimal ist?

String-Verkettung und Konvertierung zu lange später:
Ich will das nicht zum Beispiel.

Tag Monat

12 1 - & gt; 121
1 12 - & gt; 121

    
yli 31.08.2009, 17:30
quelle

2 Antworten

12

Wenn Sie einige numerische Werte haben und einen einzelnen "eindeutigen" (dh statistisch unwahrscheinlichen Duplikat) Wert von ihnen haben müssen, können Sie normalerweise eine Formel verwenden wie:

%Vor%

Dabei sind P1 und P2 entweder gut gewählte Zahlen (wenn Sie beispielsweise wissen, dass 'a' immer im Bereich von 1 bis 31 liegt, können Sie P1 = 32 verwenden) oder, wenn Sie nichts über die zulässigen Bereiche von a wissen , b, c Der beste Ansatz besteht darin, P1 und P2 als große Primzahlen zu haben (sie haben die geringste Chance, kollidierende Werte zu erzeugen). Für eine optimale Lösung ist die Mathematik ein bisschen komplexer als das, aber mit Primzahlen können Sie in der Regel eine anständige Lösung haben.

Zum Beispiel ist die Java-Implementierung für .hashCode() für ein Array (oder einen String) ungefähr wie folgt:

%Vor%

Obwohl ich persönlich eine Primzahl größer als 31 gewählt hätte, können Werte innerhalb eines Strings leicht kollidieren, da ein Delta von 31 Orten recht häufig auftreten kann, z. B .:

%Vor%     
lapo 01.09.2009 14:10
quelle
2

Ihr

%Vor%

Problem wird einfach behoben, indem Sie die Eingabenummern auf die für jedes Eingabefeld erwartete maximale Breite auffüllen.

Wenn beispielsweise das erste Feld zwischen 0 und 10000 und das zweite Feld zwischen 0 und 100 liegen kann, lautet Ihr Beispiel:

%Vor%     
Chris Judge 31.08.2009 18:53
quelle

Tags und Links