J'ai cherché un simple Algorithme Java permettant de générer une chaîne alphanumérique pseudo-aléatoire. Dans mon cas, cette chaîne serait utilisée comme identifiant unique de la session/clé, qui serait "probablement" unique sur plus d'un million d'ordinateurs. 500K+
(mes besoins ne nécessitent pas vraiment quelque chose de plus sophistiqué).
Idéalement, je pourrais spécifier une longueur en fonction de mes besoins d'unicité. Par exemple, une chaîne générée d'une longueur de 12 pourrait ressembler à ceci "AEYGF7K0DM1X"
.
162 votes
Méfiez-vous de le paradoxe de l'anniversaire .
62 votes
Même en tenant compte du paradoxe de l'anniversaire, si vous utilisez 12 caractères alphanumériques (62 au total), il vous faudrait encore bien plus de 34 milliards de chaînes de caractères pour atteindre le paradoxe. Et le paradoxe d'anniversaire ne garantit pas une collision de toute façon, il dit juste qu'il y a plus de 50% de chances.
6 votes
@NullUserException 50 % de chance de succès (par essai) est sacrément élevé : même avec 10 essais, le taux de succès est de 0,999. En gardant cela à l'esprit et le fait que vous pouvez essayer BEAUCOUP sur une période de 24 heures, vous n'avez pas besoin de 34 milliards de chaînes de caractères pour être pratiquement sûr de deviner au moins l'une d'entre elles. C'est la raison pour laquelle certains jetons de session doivent être très, très longs.
0 votes
Ce billet de blog devrait être utile - code pour produire des chaînes alphanumériques : rationaljava.com/2015/06/
19 votes
Ces 3 codes à une ligne sont très utiles, je suppose
Long.toHexString(Double.doubleToLongBits(Math.random()));
UUID.randomUUID().toString();
RandomStringUtils.randomAlphanumeric(12);
0 votes
La longueur n'est pas pertinente car elle dépend de l'encodage. Ce qui vous intéresse, c'est l'entropie. Une entropie de 128 bits devrait convenir à la plupart des cas d'utilisation (par exemple, 32 chiffres hexadécimaux).
25 votes
@Pijusn Je sais que c'est vieux, mais... les "50% de chance" dans le paradoxe de l'anniversaire sont... PAS "par essai", c'est "50% de chances que, sur (dans ce cas) 34 milliards de chaînes de caractères, il existe au moins une paire de doublons". Il faudrait 1,6 sept millions - 1.6e21 - d'entrées dans votre base de données pour qu'il y ait 50% de chances par essai.
1 votes
@Walt Vous avez raison, je l'ai un peu mal compris à l'époque. Mais même maintenant, je considérerais que 50% avec 36 milliards est un risque trop élevé pour une session. De plus, je ne pense pas que l'utilisation de jetons plus longs/sécurisés va introduire des problèmes significatifs.