Raketensilo: Input benötigt

Beitrag lesen

Nun, da meine Antwort nicht jedem gefallen hat, mangelt es wohl an einem anschaulichen und trivialem Beispiel:

1. Testumgebung

Zunächst brauche ich einmal 500 Wörter und einmal 1000 Wörter. Ich missbraucne mangels Phantasie und Lust dafür eine der gängigen Passwortlisten:

wget https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt

und erzeuge zwei Dateien. Eine mit 500 (das ist die vorgestellte Anzahl der Kategorien aus der Datenbank) Wörtern aus der Liste. Und eine mit 1000 Wörtern (so wurde der EINE Vergleichstext beschrieben, über dessen Herkunft - anders als bei den „Kategorien“ keine Aussage getroffen wurde, wobei aber die Beschreibung die Deutung zulässt, dass dieser aber nicht in der Datenbank ist). Mindestens 2 bis 15 Wörter kommen in den "Kategorien" und im "Text" vor. Das hab ich mal als Annahme für den Test untersellt:

<?php

$ar = file( '/tmp/10-million-password-list-top-1000000.txt' ); 
$last = count( $ar );
for ( $i=0; $i<$last; $i++ ) {
	$s = trim( $ar[$i] );
	if ( $s == '' ) {
		unset( $ar[$i] );
	} else {
		$ar[$i] = $s;	
    }	
}

$keys = array_rand( $ar, 500 );

$ar500 = [];

foreach ( $keys as $k ) {
   $ar500[] = $ar[$k];
}

unset( $ar );

file_put_contents ( '500.json', json_encode( $ar500 ) );

$z = rand(2, 15);


$keys = array_rand( $ar500, $z );

$ar=[];
foreach( $keys as $k ) {
	$ar[] = $ar500[$k];
}

$alpha='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$l = strlen( $alpha );

for( $k=$z+1; $k<=1000; $k++ ) {
	$z = rand(5,15);
	$w='';
        for ( $i = 0; $i<=$z; $i++) {
		$w .= substr ( $alpha , rand( 0,$l-1 ), 1 );
	}
	$ar[] = $w;
}

shuffle( $ar );
file_put_contents( '1000.txt', implode( ' ', $ar ) );

Ich behaupte ausdrücklich nicht, dass der obige Code elegant, richtungsweisend oder gar „der einzig Wahre“ sei. Für den Test genügt er aber: Die Datei '1000.txt' mit den 1000 Wörtern enthält nach dem Ausführen zwischen 0 und 10 der Kategorien, sonst irgendwelche "Wörter" aus Buchstaben und Ziffern, 5 bis 15 Zeichen lang. Das Erzeugen dauert auf meinem nicht gar so schnellen Rechner übrigens in etwa 1 Sekunde.

2. Eine von vielen "Lösungen"

Nachdem ich nun diese beiden Dateien habe, werde ich die Datei mit mit den 500 zu vergleichenden Begriffen ("Kategorien") einfach mal vom Dateisystem öffnen und als JSON Parsen lassen - statt aus der Datenbank zu lesen. Das dürfte "halbwegs" egal sein…

Dann nehme ich den String mit 1000 Wörtern aus der Textdatei, implodiere den zu einem Array und dann mache ich einen Vergleich.

Ich habe nicht umsonst gefragt, was der Vergleich bringen soll. Denn das kann alles mögliche sein - aber so lange ich keine Nachricht bekomme, mache ich einen einfachen und stumpfen Vergleich auf vollständige übereinstimmung:

<?php

$w1000 = explode( ' ', file_get_contents( '1000.txt' ) );
$w500 = json_decode( file_get_contents( '500.json' ) );


foreach ( $w500 as $k ) {
	$helper[ $k ] = true;
}


$founds=[];

foreach ( $w1000 as $w ) {
	if ( array_key_exists ( $w, $helper ) ) {
		$founds[]=$w;
	}
}

print_r( $founds );

Ich behaupte ausdrücklich nicht, dass der obige Code elegant, richtungsweisend oder gar der einzig Wahre sei. Für den Test genügt er aber.

3. Test und Zeiten:

Und jetzt sehen wir mal nach, ob mein Vorgehen "geeignet" ist:

/tmp$ php 1.php ; time php 2.php

Array
(
    [0] => wasteoftime
    [1] => dcrpce
    [2] => volodya
    [3] => mohen
    [4] => stfu
    [5] => camcam
    [6] => wcamwr
    [7] => catsterr
    [8] => q
)

real	0m0,030s
user	0m0,022s
sys	  0m0,009s

Hinweis: In den 0m0,030s ist der Start vom PHP als CLI mit drin… Auf einem Server mit PHP als FastCGI oder Modul würde das sicherlich schneller laufen.

Was aber fest steht: Mit der Nutzung einer Datenbank und ggf. mehreren Abfragen ist eine solche Geschwindigkeit definitiv nicht zu erwarten. Durch den nachvollziehbaren Test ist die Richtigkeit meines Satzes "Dann ist das womöglich (abhängig von der Aufgabe) nicht so unbedingt ein Job für die Datenbank." bewiesen.

Auch mein Hinweis auf das Fehlen einer vernünftigen Bechreibung hinsichtlich der Aufgabe geht nicht fehl, weil bei anderen Aufgaben natürlich ein anderes Vorgehen sinnvoll sein kann.

4. Anmerkung:

Natürlich kann hier mit negativen Bewertungen um sich hauen… Ich würde demjenigen sehr ernsthaft was ganz anderes empfehlen. Nämlich sein Verhalten zu überprüfen.