no additional field in the database - through algorithm the promotional code can be decoded back to userid
Mentre di solito questo sarebbe risolto attraverso una tabella aggiuntiva con riferimenti incrociati, idealmente 1: n, in modo che un ID utente possa avere più codici promozionali validi, questo sembra essere esplicitamente fuori portata. Questo preclude anche i promocodes auto-scelti, sfortunatamente.
hard to guess the userid
Idealmente, non dovrebbe essere possibile indovinare l'id utente (e assicurarsi di aver indovinato giusto).
easy to share verbally
Questo potrebbe essere il problema più grande se non si utilizza una tabella aggiuntiva.
Propongo la seguente soluzione:
Cripta i tuoi ID utente.
Esistono diversi schemi di crittografia che possono produrre risultati più piccoli che possono essere utilizzati. Ma se, come suggerito dalla tua restrizione sulle modifiche al database, il costo di implementazione è un fattore trainante, l'RSA raw potrebbe valere la pena dare un'occhiata perché mantiene il testo cifrato relativamente piccolo e le librerie di crittografia sono prontamente disponibili.
I bit risultanti potrebbero essere tradotti in parole in linguaggio naturale, ad esempio utilizzando un vocabolario per diceware .
Utilizzando questo approccio, il testo cifrato sarebbe facile da comunicare (dato che si tratta di una stringa di parole) e facile da decifrare (traduzione inversa, decifrare i bit risultanti).
C'è comunque un problema: quei codici potrebbero richiedere più tempo del previsto (a seconda dello schema di crittografia scelto) e potrebbero comportare una penalità temporale quando si tratta di digitarli.
Sebbene questo produca codici più lunghi (in termini di dimensioni delle stringhe), è molto più facile da trasmettere verbalmente, specialmente per i madrelingua, rispetto al risultato di base32, base64 o uno dei soliti approcci per la codifica del trasporto.
Quindi, anche se una tabella 1: n sarebbe l'ideale, usare uno schema di crittografia appropriato e finire con un codice di 3 parole potrebbe essere la cosa migliore - e sicuramente più facile da condividere verbalmente rispetto ai soliti sospetti per i dati di codifica .