17 Stimmen

12-stellige eindeutige Zufallszahlengenerierung in Java

Ich habe an einer Anwendung gearbeitet, bei der wir eine eindeutige Nummer generieren müssen, und praktisch gab es keine vordefinierten Einschränkungen, so dass ich den Java UUD-Generator verwendet habe und er gut funktioniert hat. Jetzt sind wir eine neue Anforderungen gegeben, 12 Ziffern eindeutige Zufallszahl zu erzeugen.

Kann mir jemand einen guten Weg/Algorithmus zeigen, um dies zu erreichen, da ich keine Möglichkeit in der UUID-generierten Nummer sehe.

Vielen Dank im Voraus

34voto

dogbane Punkte 253146

Erzeugen Sie jede Ziffer durch den Aufruf random.nextInt . Um die Eindeutigkeit zu gewährleisten, können Sie die bisher verwendeten Zufallszahlen verfolgen, indem Sie sie in einer Menge aufbewahren und prüfen, ob die Menge jedes Mal die von Ihnen erzeugte Zahl enthält.

public static long generateRandom(int length) {
    Random random = new Random();
    char[] digits = new char[length];
    digits[0] = (char) (random.nextInt(9) + '1');
    for (int i = 1; i < length; i++) {
        digits[i] = (char) (random.nextInt(10) + '0');
    }
    return Long.parseLong(new String(digits));
}

3voto

Nishant Punkte 51997
(long)Math.random()*1000000000000L

Es besteht jedoch die Gefahr eines Zusammenstoßes

Warum keine Sequenz verwenden? Beginnend mit 100.000.000.000 bis 999.999.999.999? eine Aufzeichnung der zuletzt erzeugten Zahl.


Bearbeiten: Dank an Bence Olah Ich habe einen gruseligen Fehler korrigiert.

0 Stimmen

Nicht wirklich gut. Das Literal 1000000000000 vom Typ int liegt außerhalb des Bereichs... (long) Math.random() * 1000000000000l ist gut

0 Stimmen

@Nishnat: Aufzeichnung der letzten Nummer, die über Kopf angezeigt wird, und Sie müssen die Nummer an einem anderen Ort speichern, was ich vermeiden möchte

0 Stimmen

@umesh awasthi - Einzigartigkeit kann auf keine andere Weise garantiert werden. Im Idealfall haben Sie nur so viele Nummern. Andernfalls werden sie sich auf lange Sicht duplizieren.

2voto

Radek Jira Punkte 101

Verbesserte geprüfte Lösung mit StringBuilder():

public static long generateRandom() {
    Random random = new Random();
    StringBuilder sb = new StringBuilder();

    // first not 0 digit
    sb.append(random.nextInt(9) + 1);

    // rest of 11 digits
    for (int i = 0; i < 11; i++) {
        sb.append(random.nextInt(10));
    }

    return Long.valueOf(sb.toString()).longValue();
}

1voto

Waldheinz Punkte 10318

Ich hatte vor kurzem eine sehr ähnliche Anforderung und bin auf diese Idee gekommen:

import com.google.inject.Provider;
import java.security.SecureRandom;
import org.apache.commons.codec.binary.Base64;

public final class SecureKeyProvider {

    private final SecureRandom rng;
    private final int entropyBytes;

    public SecureKeyProvider(int entropyBytes) {
        this.rng = new SecureRandom();
        this.entropyBytes = entropyBytes;
    }

    public String get() {

        /* SecureRandom documentation does not state if it's thread-safe,
         * therefore we do our own synchronization. see
         *
         * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498354
         */

        synchronized (this.rng) {
            final byte[] random = new byte[this.entropyBytes];
            rng.nextBytes(random);
            return Base64.encodeBase64URLSafeString(random);
        }
    }

}

Es verwendet den Base64-Encoder von Apache Commons, den ich ohnehin in meinem Projekt hatte. Vielleicht möchten Sie es durch etwas Einfaches ersetzen, aber ansonsten erfüllt es die Aufgabe.

0 Stimmen

Übrigens: Einzigartig und Der Zufall scheint ein wenig seltsam zu sein. Ich würde mich dafür entscheiden, eine von ihnen zu wählen, oder die 12-Ziffern-Anforderung fallen zu lassen und mit UUIDs zu arbeiten, wie Sie es bereits getan haben.

0 Stimmen

Stimme zu und ich habe bereits eine Frage gestellt. Ich werde nur über die Zufallszahl nachdenken.

1voto

Bence Olah Punkte 669
Random random = new Random();
Math.round(random.nextFloat() * Math.pow(10,12))

0 Stimmen

Ja, also scheint es überhaupt nicht 'gut' zu sein. Es gibt keine Garantie für die Einzigartigkeit.

0 Stimmen

Richtig, in diesem Fall besteht die Möglichkeit einer Kollision. Eine Lösung wäre, die vorherigen Werte zu speichern und neu zu generieren, wenn es zu einer Kollision kommt. Wenn der Zufallsgenerator keinen Zustand hat, wird es immer eine Chance für eine Kollision geben.

0 Stimmen

BTW UUID ist auch nicht 100% eindeutig, siehe de.wikipedia.org/wiki/ .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X