Beliebige Strings auf einen von mehreren Integern "reduzie"
ScaraX
- php
Hallo,
Ich habe verschiedene URLs, die auf statische Dateien (CSS, Bilder usw) verweisen.
Da ein Browser nur eine begrenzte Anzahl Dateien gleichzeitig von einer Domain lädt, wollte ich diese statischen Dateien auf verschiedene Subsomains verteilen.
Das ganze könnte z.B. so aussehen:
$urls = array(
'http://static1.example.com/images/',
'http://static2.example.com/images/',
'http://static3.example.com/images/',
);
$files = array(
'foo.png',
'bar.png',
'baz.png',
'foobar.png'
);
Die Anzahl der Dateien kann bei unterschiedlichen Requests variieren, die Anzahl der URLs wird einmalig festgelegt und bleibt dann so.
Jetzt wollte ich die Dateien gleichmäßig auf die URLs verteilen, allerdings soll die gleiche Datei jedes mal der gleichen URL zugewiesen werden, also nicht jedes mal neu per Zufallsgenerator erzeugt werden.
Meine Idee war, dass ich aus dem Dateinamen irgendwie eine Zahl aus einer definierten Menge erzeuge, aus der ich dann einen der vorhandenen Array-Keys bilden kann.
Leider habe ich keine Ahnung, wie so was möglich wäre.
Für Ideen oder Denkanstöße wäre ich euch sehr verbunden :)
MfG
ScaraX
Hi,
Die Anzahl der Dateien kann bei unterschiedlichen Requests variieren, die Anzahl der URLs wird einmalig festgelegt und bleibt dann so.
Dann kannst du die Verteilung doch eigentlich auch manuell vornehmen.
Jetzt wollte ich die Dateien gleichmäßig auf die URLs verteilen, allerdings soll die gleiche Datei jedes mal der gleichen URL zugewiesen werden, also nicht jedes mal neu per Zufallsgenerator erzeugt werden.
Meine Idee war, dass ich aus dem Dateinamen irgendwie eine Zahl aus einer definierten Menge erzeuge, aus der ich dann einen der vorhandenen Array-Keys bilden kann.
Das wäre also eine primitive Art von Hashfunktion.
Bspw. den Anfangsbuchstaben des Dateinamens zu nehmen, und auf die Anzahl Sudomains umzulegen, in dem du die Nummer des Buchstabens im Alphabet modulo der Anzahl der Subdomains nimmst, wäre eine primitive Möglichkeit (die natürlich noch keinerlei Gleichverteilung ergibt).
Gedanken über weitere Ansätze mach' dir bitte erst mal selber.
MfG ChrisB
Hi
Danke, Hashfunktion und Module waren gute Stichwörter!
Habe das folgendermaßen gelöst:
// ...
$hash = md5($file);
$part = substr($hash, 0, 6);
$partDec = hexdec($part);
$key = $partDec % (count($urls));
// ...
Ich weiß zwar nicht, wie performant das ist, aber es funktioniert und bei meinen Tests waren die URLs auch gleichmäßig verteilt :)
MfG
ScaraX