Normalement, je recommanderais un UUID/GUID (comme NWCoder does in his link), mais un UUID est 16 octets de données brutes, donc il ne peut pas être exprimé dans 15 octets de données, beaucoup moins en 15 caractères alphanumériques.
Alors la question devient, comment "unique"?
Unique à la table serait simple, il suffit d'utiliser une valeur d'incrémentation et un entier non signé ou hexadécimal.
Unique au monde serait plus difficile. Vous pourriez vous rapprocher en générant un UUID, puis en le hachant avec MD5, puis en prenant autant de bits que possible et en le convertissant en base (10 + 26 + 26 pour la casse, ou 10 + 26 pour la casse) et en prenant les 15 premiers caractères.
Unique à l'utilisateur, mais (comme vous le décrivez plus tard) unique en présence de la connectivité non-Internet serait le plus facilement fait en générant simplement une chaîne aléatoire de 15 caractères alphanumériques. Cela serait probablement équivalent à la méthode UUID/MD5 ci-dessus - essentiellement, la probabilité de collision serait très faible, et étant donné que l'utilisateur n'aura qu'une poignée de déplacements, il n'y a pratiquement aucune chance de collisions (en supposant que le générateur de nombres aléatoires de manière appropriée).