ubuntuusers.de

PHP-Funktion in Perl "übersetzen"

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

lionstarr

Anmeldungsdatum:
19. März 2006

Beiträge: Zähle...

Ich habe hier ein PHP-Skript vorliegen, dass ich gerne in Perl hätte. Leider scheint meine Übersetzung nicht zu stimmen. Vielleicht bekommt einer von euch den Fehler raus:

<?

echo generate();
function generate(){
  $Charset=array_merge(range('0','9'),range('a','z'),range('A','Z'));
  mt_srand((double)microtime()*1000000);
  for ($i=1;$i<=(count($Charset)*2);$i++)
  {
   $swap		= mt_rand(0,count($Charset)-1);
   $tmp		= $Charset[$swap];
   $Charset[$swap]	= $Charset[0];
   $Charset[0]	= $tmp;
  }
  $string = implode('',$Charset).substr(md5(time()), 0, 5).implode('',$Charset).substr(md5(substr(sha1(mktime()), 0, 10)), 0, 5);
  $ende = rand(20, strlen($string)-20);
  $start = $ende-20;
  return substr($string, $start, $ende);
 }


?>

übersetz nach Perl (fehlerhaft anscheinen):

#!/usr/bin/perl
use Time::HiRes "gettimeofday";
use Digest::MD5 "md5";
use Digest::SHA1 "sha1";
######################
sub generate_hash{   # Generiert den HASH
######################
  @Charset=(0..9,a..z,A..Z);
  srand(gettimeofday()*1000000);
  for ($i=1;$i<=(@Charset*2);$i++)
  {
   $swap	  = rand(@Charset+1);
   $tmp		  = $Charset[$swap];
   $Charset[$swap]= $Charset[0];
   $Charset[0]	  = $tmp;
  }
  $string = join('',@Charset).substr(md5(time()), 0, 5).join('',@Charset).substr(md5(substr(sha1(time()), 0, 10)), 0, 5);
  $ende = rand(length($string)-40+1)+20;
  $start = $ende-20;
  return substr($string, $start, $ende);
}

print generate_hash();

Vielen Dank schoneinmal!
mfg,
lionstarr

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Eine Beschreibung was die PHP Funktion genau macht wäre erstmal besser:
Darauf basierend kann man dann eine Subroutine schreiben in Perl.

Ansonsten sollte man bei Perl nicht Manuell srand() aufrufen und setzen. perl setzt den Random Seed Generator schon automatisch beim ersten aufruf von rand() und das deutlich besser als dein manueller aufruf.

Übrigens ist ne Funktion generate() nciht gerade hilfreich zum Verständnis. Was wird den generiert? Äpfel, Bananen? 😉

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

Scheint irgendein dusseliger Passworgenerator zu sein.
Beim überfliegen gruselte es mir.
Grund dafür waren, in meinen Augen, völlig sinnlose Tausch und Hashaktionen die scheinbar allerlei Pseudozufälliges Gedöns tun nur um am End ein Passwort rauszuwerfen.

Vielleicht versteh ich ja die tiefer liegende Genialität ( 🙄 ) nicht, aber ich würde mal schätzen da sind mindestens 75% des Codes Rechenzeitverschwendung. Hab allerdings auch keine Lust mich näher mit schlechtem, undokumentierten Gruselcode auseinanderzusetzen...ist nur mein Bauchgefühl aufgrund jahrelange Programmiererfahrung.

lionstarr

(Themenstarter)

Anmeldungsdatum:
19. März 2006

Beiträge: 65

Der Code ist nicht meiner. Ich wurde nur angeheuert, ihn zu übersetzen, und da habe ich eben dieses Problem gehabt.

Ist kein Passwortgenerator sondern eine art einmalige-sequenz-die-von-der-zeit-abhängt Generator...

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Blattlaus hat geschrieben:

Scheint irgendein dusseliger Passworgenerator zu sein.
Beim überfliegen gruselte es mir.
Grund dafür waren, in meinen Augen, völlig sinnlose Tausch und Hashaktionen die scheinbar allerlei Pseudozufälliges Gedöns tun nur um am End ein Passwort rauszuwerfen.

Genau das habe ich mir auch gedacht.
Aber wer weiß.
Soll der TE nochmal genau sagen was der Sinn der Subroutine sein soll.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Also für mich sieht es so aus als wenn einfach nen Random 20 Zeichen langer String zurück gegeben wird.
Mit dem aufruf der Hash Funktionen wird dann versucht es möglichst random zu gestalten.
Und mit dem expliziten setzen von srand() wird wohl geglaubt das man damit immer neue Strings generiert werden und nie ein bereits vorhandener random String vorkommen kann.

Allerdiengs ist das schwachsinnig. Vorallem ist das explizite setzen von srand() in einer Subroutine sowieso nicht gut. Im extremfall können die Strings damit weniger random Werden als wenn man srand() nur einmal initialisiert. Ich würde das ganze überflüssige gedöns weg lassen und einfach folgendes schreiben:

#!/usr/bin/perl
use strict;
use warnings;

print random_string(), "\n";
print random_string(), "\n";
print random_string(40), "\n";


sub random_string {
    my ($length) = @_;
    $length = 20  if  not defined $length;

    # Zeichen die benutzt werden
    my @chars = ( 'a' .. 'z', 'A' .. 'Z', 0 .. 9 );

    # Random String wird erzeugt
    my $random_string;
    for ( 1 .. $length ) {
        $random_string .= @chars[ rand @chars ];
    }

    # String zurück geben
    return $random_string;
}
Antworten |