Générer des chaînes de caractères aléatoires de 4 à 8 caractères en PHP

je dois générer une chaîne en utilisant PHP, il besoin unique et besoin à partir de 4 à 8 caractères (la valeur d'une variable).

je pensais pouvoir utiliser du hachage crc32 mais je ne peux pas décider combien de caractères, mais je suis sûr que ce sera unique. Dans l'autre main seulement créer un "générateur de mot de passe" générera la chaîne dupliquée et la vérification de la valeur dans la table pour chaque chaîne prendra un certain temps.

Comment puis-je faire qui?

Merci!


Peut-être que je peux utiliser :

  function unique_id(){
  $better_token = md5(uniqid(rand(), true));
  $unique_code = substr($better_token, 16);
  $uniqueid = $unique_code;
  return $uniqueid;
  }

  $id = unique_id();

change

  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 une corde unique à chaque fois pour un bon moment?

16
demandé sur Jeremy Dicaire 2010-10-17 22:24:14

3 réponses

En bref, je pense que vous aurez une assez bonne valeur aléatoire. Il y a toujours un risque de collision, mais vous avez tout fait pour obtenir une valeur aléatoire. uniqid () renvoie une valeur aléatoire basée sur le temps courant en microsecondes. Spécifier Rand() (mt_rand() serait mieux) et le second argument comme true to uniqid() devrait rendre la valeur encore plus unique. Hashing la valeur en utilisant md5 () devrait également le rendre assez unique que même une petite différence dans deux valeurs aléatoires générées devrait être amplifié par la fonction de hachage. idealmachine est correcte en ce qu'une valeur plus longue est moins susceptible d'avoir une collision qu'une valeur plus courte.

votre fonction pourrait aussi être plus courte puisque md5 () retournera toujours une chaîne de 32 caractères. Essayez ceci:

function unique_id($l = 8) {
    return substr(md5(uniqid(mt_rand(), true)), 0, $l);
}
46
répondu Jeremy 2010-10-17 19:31:06

le problème avec le hasard est que vous ne pouvez jamais être sûr de rien. Il y a une petite chance que vous puissiez obtenir un numéro cette fois-ci et le même numéro le prochain. Cela dit, vous voudriez faire la chaîne aussi longtemps que possible pour réduire cette probabilité. Comme exemple de la longueur de tels nombres peuvent être,Guid (globally unique identifiers) sont de 16 octets.

en théorie, quatre caractères hexadécimaux (16 bits) donnent seulement 16^4 = 65536 possibilités, tandis que huit hexadécimaux les caractères (32 bits) donnent 16^8 = 4294967296. Cependant, vous devez considérer comment il est probable pour deux hachages d'entrer en collision (le "problème d'anniversaire"). Wikipedia 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 L'encodage Base64 plutôt que les chiffres hexadécimaux; de cette façon, vous pouvez insérer 48 bits plutôt que seulement 32 bit.

huit octets est 8 * 8 = 64 bits.

3
répondu PleaseStand 2010-10-18 01:10:38

des mots de passe fiables que vous ne pouvez créer qu'à partir de ascii caractères a-zA-Z et nombres de 0 à 9. Pour ce faire, il faut utiliser uniquement des méthodes de sécurité cryptographique, comme random_int () ou random_bytes () à partir de PHP7. Repos les fonctions base64_encode () vous pouvez utiliser seulement comme fonctions de support pour rendre la fiabilité de la chaîne et la changer en ASCII caractère.

mt_rand () n'est pas sécurisé et est très ancienne. A partir de n'importe quelle chaîne de caractères, vous devez utiliser random_int(). De la chaîne binaire vous devez utiliser base64_encode () pour rendre la chaîne binaire fiable ou bin2hex, mais alors vous couperez byte seulement à 16 positions (valeurs). voir ma mise en oeuvre de ces fonctions.

0
répondu Daro from Poland 2018-05-04 15:03:54