Domanda

Sto lavorando a un evento online di sistema, dove gli utenti saranno in grado di stamparla suoi biglietti e presentarsi all'evento, dove verrà sottoposto a scansione (codice a barre) e, idealmente, la persona ticketing si metterà in. Il mio problema è come per creare un "codice biglietto" che soddisfi i seguenti requisiti:

  • ogni "codice biglietto" devono essere sufficientemente diversi tra loro (cioè non numerati in modo sequenziale)
  • idealmente il biglietto sarà confrontato con un DB centrale per impedire il riutilizzo, ma deve essere in grado di lavorare fuori linea troppo, nel qual caso il sistema deve verificare la presenza di un codice del biglietto "valido" e che non è stato utilizzato in questo cancello.
  • il "codice biglietto" deve essere abbastanza piccolo per facilitare il keying, se necessario
  • il possessore del biglietto avrebbe solo bisogno il biglietto per entrare in (cioè nessun controllo ID)

La gamma dei dati è molto piccolo, ci sarà solo circa 20 eventi nell'arco di 4 giorni con circa 5.000 biglietti per evento (circa 100.000 codici di biglietti diversi)

Ora ho diversi campi che non sono stampati sul biglietto e non nota per l'utente che posso usare per codificare parte del "codice di biglietto", così ho potuto usare l'EventId, OrderId, EventDate e un po 'di sale per creare un piccolo "hash" per parte del codice (idee?), ma io sono ancora bloccato con l'id biglietto che è sequenziale o un GUID (sarebbe troppo lungo)

Quindi, qualsiasi idee o indicazioni su come fare questo?

È stato utile?

Soluzione

Si consideri uno schema molto semplice che si basa su una rete di Feistel per permutare, per esempio, il numero ID ticket. Questo messaggio (che sembra essere nelle liste di PostgreSQL, ma in realtà non hanno molto a che fare con PostgreSQL) descrive un semplice Feistel network . Su ogni biglietto è possibile stampare un numero ID biglietto (in sequenza scelta), poi un "codice segreto biglietto" che è il risultato di mettere il numero di ID attraverso una rete di Feistel. Eventuali variazioni includono aggiungendo una cifra di controllo per il codice segreto, e basando l'ingresso alla rete di Feistel su più di solo il numero sequenziale generato (numero + 10,000 * numero di ID evento, eccetera).

Altri suggerimenti

Perché reinventare la ruota? Basta fare qualcosa di simile (codice Python, mi chiede se avete bisogno di chiarimenti):

import hashlib

secretpassword = "blah"

def createticket(eventnum, ticketnum):
    m = hashlib.md5() # or any crypto hash you like
    m.update("%s%s%s" % (eventnum, ticketnum, secretpassword))
    return m.hexdigest()[:10]

Esempio:

Numero evento 1

Ticket numero 123

createticket(1,123)
# output: 2d7f242597

Mr ticketman viene intorno con la sua verificatore ed entra nella / numero del biglietto dell'evento e l'hash:

def verifier(eventnum, ticketnum, hash):
    return hash == createticket(eventnum, ticketnum)

verifier(1,123, "2d7f242597")
# ouput: True

vi suggerisco di dare il algoritmo Verhoeff una prova.

Due modi posso vedere:

  1. generare un numero casuale, o almeno una parte casuale per un numero e conservarlo in un database centrale. Poi scaricare il database in tutti i sistemi del cancello per controllare contro.
  2. Il numero deve essere autosufficiente. In altre parole, il numero deve essere in grado di controllare, senza l'elenco salvato. Questo suona come una sorta di sistema di checksum. Per esempio, si potrebbe emettere numeri da 1 e verso l'alto, renderli 5 cifre (00000-99999 = 100.000 numeri), e prepende 1-3 lettere, assicurandosi che si finisce con una somma di controllo che avrebbe check out.

Per la verifica in linea, vedo solo una soluzione facile ..

Aggiunge alla ID biglietti per un hash del ID biglietti e sale per-evento. È possibile troncare qualsiasi hash crittografico alla dimensione desiderata. Non riesco a pensare a una ragione particolare per usare qualsiasi cosa, ma un numero casuale per l'ID biglietto di base stessa.

Ciò consente di limitare la dimensione del biglietto di ID e hanno un titolo chiaramente proporzionale in relazione alla dimensione della ID ticket.

Si potrebbe fare un calcolo CRC.

Fondamentalmente, appena inizia ad aggiungere ogni carattere della stringa, e limitare la lunghezza di un intero lungo.

Si può iniziare con un numero a caso noto e memorizzarlo nei primi 4 byte, e avere l'ultima quattro essere un calcolo come ho descritto in precedenza.

Questo sarebbe due int, o otto byte.

Ecco uno schema che ha il vantaggio di lasciare che si calcola l'hash biglietto successivo dal precedente (in modo da poter verificare se ne manca uno), ma non si lascia estranei calcolano la prossima:

Ticket.0 = substring(HASH(SALT + IV        ), 0, LENGTH)
Ticket.i = substring(HASH(SALT + Ticket.i-1), 0, LENGTH)

dove

  • HASH è qualunque funzione di hashing che distribuisce l'entropia relativamente uniformemente sulla stringa di output
  • SALT è una costante a mantenere segreto; è una buona idea di utilizzare una diversa per ogni evento
  • IV è un'altra costante di mantenere segreto
  • La lunghezza è la lunghezza del biglietto di ID che si desidera (10 nella sua interrogazione, ma 12 non è fuori questione e ti dà 256 volte di più biglietto ID)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top