• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Zufallsgenerator für Zahlen und Strings

Status
Für weitere Antworten geschlossen.

Patrick Leuppert

Neues Mitglied
Man findet im Internet ja viele Funktionen um ein Passwort zu generieren.
Mir hat ein einfacher Passwort-Generator jedoch nicht gereicht, denn ich benutze die Funktion nicht nur für Passwörter, sondern auch für Codes (z.B. Aktivierung). Außerdem will ich bei den Passwörtern vermeiden, dass gleich aussehende Buchstaben in einem generierten Passwort vorkommen.

Die folgende Funktion stelle ich allen zur Verfügung, die Verwendung dafür haben.

PHP:
function getRandom($length=10,$security=3,$not2use="") {
  $disabled_chars = explode(',', $not2use);
  $rnd_string='';
  if($security > 3 || $security < 1)
  {
    $security = 3;
  }
  for ($i=1;$i<=$length;$i++) {
    $chr='';
    switch (mt_rand(1,$security)) {
      case 1:
        // 0-9
        $chr=chr(mt_rand(48,57));
        break;
      case 2:
        // a-z
        $chr=chr(mt_rand(97,122));
        break;
      case 3:
        // A-Z
        $chr=chr(mt_rand(65,90));
    }
    if(in_array($chr, $disabled_chars)){
      $i--;
    } else {
      $rnd_string.=$chr;
    }
  }    
  return $rnd_string;
}
Die erfahrenen Programmierer werden das Prinzip verstehen. Für alle anderen hier eine kurze Erklärung:

Die Funktion hat 3 Parameter.
$length, $security und $not2use

$length ist die Länge des zurückgegeben String oder der Zahl (je nach Sicherheitsstufe)

$security ist die zuvor genannte Sicherheitsstufe.
  • 1 sind nur Zahlen von 0-9
  • 2 sind Zahlen von 0-9 und alle Kleinbuchstaben von a-z
  • 3 sind Zahlen von 0-9, alle Kleinbuchstaben von a-z und alle Großbuchstaben von A-Z
$not2use sind alle Zahlen und Zeichen, die nicht in der generierten Zahl bzw. dem generierten String vorkommen sollen. Sie werden mit Komma getrennt übergeben.

Die Funktion kann gerne auch in die PHP FAQ hier im Forum eingefügt werden.

Liebe Grüße

Patrick
 
ich steuer mal etwas dagegen:

PHP:
<?php

class SecHash
{
    private $salt;
    private $hashBuffer;
    private $specialChars;
    
    function __construct($salt=PHP_VERSION)
    {
        $this->salt = sha1($salt);
    }
    
    public function getUnique($lenght)
    {
        if(!is_int($lenght))
            throw new Exception('Parameter muss ein Int sein!');
            
        $loops = ceil($lenght / 32);
        $this->hashBuffer = '';
              
        for($i=0;$i <= $loops;$i++)
            $this->hashBuffer .= md5(uniqid(mt_rand().$this->salt.$i, true));
        
        return substr($this->hashBuffer,0,$lenght);
    }
}

$sH = new SecHash('Ein sicherer Salt gegen Tabellen.');
echo $sH->getUnique(40);
 
ich stelle einfach mal in den raum, dass mein ansatz deutlich besser ist.

Gründe:

a. Zahlen / Buchstaben zu entfernen macht nicht wirklich sinn.
b. mt_rand ist sehr rechenintensiv
c. man das rad nicht neu erfinden muss
d. Php die Hash Funktionen nativ unterstützt
 
Das ganze hat den Hintergrund, dass ich z.B. verhindern will, dass z.B. l (kleines L) und I (großes i) zusammen in einem generierten Passwort vorkommt, da der User der das Passwort bekommt mehrmals probieren muss...

Bei deinem md5 Result kommen außerdem immer nur Zahlen und Kleinbuchstaben vor, wenn ich das richtig verstanden hab.

Die Funktion ist für ein Community Portal, bei dem mit vielen Benutzern und noch viel mehr Bildern gerechnet wird. Mit der Funktion wird also nicht nur ein Passwort und ein Aktivierungscode generiert, sondern auch noch einstellige Zufallszahlen und Zufallsbuchstaben für die dynamische Ordnerstruktur zur Speicherung der Bilder.

Und aus all diesen Anforderungen ist diese Funktion entstanden.

Daher finde ich deinen Beitrag an dieser Stelle total überflüssig, weil man nicht einfach behaupten kann, dass etwas besser ist, wenn man nicht weiß wofür das ursprüngliche - von dir als schlechter angesehene - gedacht ist.

Die Tatsache, dass mt_rand() rechenintensiv sein soll lassen wir mal so stehen, bis du Benchmarks gemacht hast mit vergleichbaren Funktionen dieser Art :twisted:
 
Status
Für weitere Antworten geschlossen.

Neueste Beiträge

Zurück
Oben