2 Stimmen

8 Zeichen Zufallscode

Ich habe mir die Antworten auf einige ähnliche Fragen auf SO angesehen, konnte aber nicht finden, wonach ich gesucht habe.

Gibt es einen effizienteren Weg, 8-stellige eindeutige IDs zur Basis 36 (0-9A-Z) zu generieren, als eine eindeutige ID zu erzeugen und die DB abzufragen, um zu sehen, ob sie bereits existiert, und dies zu wiederholen, bis man eine eindeutige ID erhält, die noch nicht verwendet wurde?

Andere Lösungen, die ich gefunden habe, verwenden die Zeit, aber das ist vielleicht zu einfach zu erraten und funktioniert möglicherweise nicht gut in verteilten Systemen. Betrachten Sie diese IDs als Promo-Codes.

0voto

martineau Punkte 110783

Ich habe einmal ein ähnliches Problem mit C++ gelöst, bei dem es um eine geringere Anzahl möglicher IDs ging, aber es könnte sinnvoll sein, einige Möglichkeiten zur Vergrößerung zu prüfen. Im Grunde habe ich eine große Bitmap für alle möglichen IDs erstellt und einfach nachgeschaut, ob eine in Gebrauch war, indem ich das entsprechende Bit dafür getestet habe.

Um die Anforderungen an den Arbeitsspeicher zu minimieren, speicherte ich die Bitmap in einer Rohbinärdatei und suchte mit Hilfe von Random-Access-File-I/O nach dem Byte mit dem entsprechenden Bit, das ich prüfen und/oder setzen musste.

Ihr viel größerer ID-Speicherplatz würde eine 328 GB große Bitmap erfordern, was wahrscheinlich nicht in Frage kommt. Andererseits kann eine Python set der verwendeten IDs könnte akzeptabel sein, je nachdem, wie viele IDs Ihrer Meinung nach tatsächlich verwendet werden. Andere Alternativen könnten eine Art von spärliche Datei oder die Technik der spärlichen Matrix, wie sie in scipy.sparse .

Ich hoffe, das hilft.

0voto

Matthew Schinckel Punkte 33617

Ich mache etwas Ähnliches, um Aktivierungscodes zu generieren: 8-Buchstaben-Zeichenfolgen in Kleinbuchstaben, die nur einmal verwendet werden können. Sie sollen innerhalb kurzer Zeit nach ihrer Erstellung verwendet werden (in der Regel innerhalb von Minuten, möglicherweise aber auch erst nach einer Woche), müssen aber eindeutig sein. Nach ihrer Verwendung werden sie aus der Datenbank entfernt.

Ich generiere einfach einen Wert und prüfe, ob er in der Datenbank verwendet wird. Das funktioniert im Moment, denn es gibt nicht haufenweise ungenutzte Codes in der Datenbank, aber sie sind immer noch nicht leicht zu erraten, selbst wenn man einen erhalten hat.

Was den Generierungscode betrifft:

def _generate_code(self, length):
    random.seed()
    candidates = string.lowercase[:26]
    result = ""
    for i in range(length):
        result += random.choice(candidates)
    return result

0voto

paulmurray Punkte 3277

Muss sie kryptografisch sicher sein?

Falls nicht, genügt pc(n) = a + bn, wobei b eine Primzahl im Verhältnis zu 36^8 ist. Verwenden Sie ein Array von Byte.

foo(int n, byte[] a, byte[] b) {
  byte[] r = new byte[8];
  int carry=0;
  for(int i = 0; i<8;i++) {
    int x = carry + a[i] + n*b[i];
    r[i] = x % 36;
    carry = x / 36;      
  }
}

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