Générer chaîne aléatoire de 4 à 8 caractères en PHP
J'ai besoin de générer une chaîne de caractères à l'aide de PHP, il besoin être unique et besoin être de 4 à 8 caractères (la valeur d'une variable).
J'ai pensé que je peut utiliser hachage crc32, mais je ne peux pas décider comment le nombre de caractères, mais bien sûr, il sera unique. En revanche, seulement de créer un "générateur de mot de passe" va générer dupliqué chaîne et de la vérification de la valeur dans la table pour chaque chaîne va prendre un certain temps.
Comment puis-je le faire?
Merci!
Peut-être que je peux l'utiliser :
function unique_id(){
$better_token = md5(uniqid(rand(), true));
$unique_code = substr($better_token, 16);
$uniqueid = $unique_code;
return $uniqueid;
}
$id = unique_id();
Modification :
function unique_id($l = 8){
$better_token = md5(uniqid(rand(), true));
$rem = strlen($better_token)-$l;
$unique_code = substr($better_token, 0, -$rem);
$uniqueid = $unique_code;
return $uniqueid;
}
echo unique_id(4);
Pensez-vous que je vais obtenir de l'unique chaîne à chaque fois pour une goood temps?
Les personnages de ce jeu de caractères?
"la vérification de la valeur dans la table pour chaque chaîne, ce qui prendra un certain temps" - pas si vous définissez un index unique sur la colonne. Ensuite vous avez juste à vérifier si l'insertion a travaillé, et si pas de vous régénérer la chaîne et essayez de nouveau. Ne dis pas que c'est une bonne idée. Dépend.
Ouais, mais si j'ai 1 000 000 d'entrées, de générer une chaîne de caractères jusqu'à ce qu'un unique est trouvé :S... LOL mais pour les petites quantités, je me souviendrai de cette 😉 Merci beaucoup!
"la vérification de la valeur dans la table pour chaque chaîne, ce qui prendra un certain temps" - pas si vous définissez un index unique sur la colonne. Ensuite vous avez juste à vérifier si l'insertion a travaillé, et si pas de vous régénérer la chaîne et essayez de nouveau. Ne dis pas que c'est une bonne idée. Dépend.
Ouais, mais si j'ai 1 000 000 d'entrées, de générer une chaîne de caractères jusqu'à ce qu'un unique est trouvé :S... LOL mais pour les petites quantités, je me souviendrai de cette 😉 Merci beaucoup!
OriginalL'auteur Jeremy Dicaire | 2010-10-17
Vous devez vous connecter pour publier un commentaire.
En bref, je pense que vous aurez une assez bonne valeur aléatoire. Il y a toujours la possibilité d'une collision, mais vous avez fait tout votre possible pour obtenir une valeur aléatoire. uniqid() renvoie une valeur aléatoire basé sur le courant de temps en microsecondes. La spécification de rand() (fonction mt_rand() serait mieux) et le deuxième argument comme vrai pour uniqid (), la valeur encore plus unique. Le hachage de la valeur à l'aide de md5() devrait aussi faire assez unique que même une petite différence de deux valeurs aléatoires générées doivent être amplifiés par la fonction de hachage. idealmachine est correct dans le sens que plus la valeur est moins susceptible d'avoir une collision qu'un plus court.
Votre fonction pourrait également être plus court depuis md5() retournera toujours une longue chaîne de 32 caractères. Essayez ceci:
OriginalL'auteur Jeremy
Le problème avec de l'aléatoire, c'est que vous ne pouvez jamais être sûr de rien. Il ya une petite chance que vous pourriez obtenir un certain nombre de ce temps et le même nombre à la prochaine. Cela dit, vous voulez faire de la corde le plus longtemps possible afin de réduire cette probabilité. Comme un exemple de combien de temps ces numéros peuvent être, Guid (globally unique identifiers) de 16 octets de long.
En théorie, quatre caractères hexadécimaux (16 bits) donner à seulement 16^4 = 65536 possibilités, tandis que huit caractères hexadécimaux (32 bits) donner 16^8 = 4294967296. Cependant, vous devez considérer comment il est probable pour tout deux hachages d'entrer en collision (le "problème d'anniversaire"). Wikipédia a un bonne table sur la probabilité de telles collisions. En bref, quatre caractères hexadécimaux sont certainement pas suffisant, et huit peut-être pas.
Vous pouvez envisager d'utiliser un encodage Base64 plutôt que de chiffres hexadécimaux; de cette façon, vous pouvez adapter 48 bits au lieu de 32 bits.Huit octets est de 8 * 8 = 64 bits.
En fait, en regardant le code que vous avez posté plus près, vous êtes déjà à l'aide de md5 avec la raw_output option, donc je suppose que votre application est OK avec tous les caractères du code ASCII de 0 à 255 ( null bytes). Si c'est en fait un problème si, ensuite, vous pouvez prendre les six premiers octets de l'algorithme MD5, puis base64_encode ().
Ok merci, je vais prendre un regard plus profond sur ce à demain 🙂
OriginalL'auteur PleaseStand
Fiables mots de passe, Vous pouvez le faire seulement à partir de ascii caractères a-zA-Z et chiffres de 0 à 9. Faire que la meilleure façon est d'utiliser uniquement du point de vue cryptographique sécurisé méthodes, comme la random_int() ou random_bytes() de PHP7. Reste fonctionne comme base64_encode() Vous pouvez n'utiliser que les fonctions de soutien pour faire la fiabilité de la chaîne et de le modifier pour ASCII caractères.
la fonction mt_rand() n'est pas sécurisé et est très ancienne.
À partir de n'importe quelle chaîne, Vous devez utiliser random_int(). À partir d'une chaîne binaire, Vous devez utiliser base64_encode() pour faire une chaîne binaire fiable ou bin2hex, mais alors Vous aurez coupé octet seulement à 16 positions (valeurs).
Voir ma mise en œuvre de ces fonctions.
OriginalL'auteur Daro from Poland