2009-08-24 6 views
0

Die Website, an der ich gerade arbeite, möchte ihre eigenen verkürzten URLs generieren, anstatt sich auf eine Drittpartei wie tinyurl oder bit.ly zu verlassen.URL-Kürzung: Verwenden von Inode als Kurzname?

Offensichtlich konnte ich eine laufende neue URLs zählen, wie sie auf der Website hinzugefügt werden und diese verwenden, um die kurzen URLs zu generieren. Aber ich versuche das zu vermeiden, wenn es möglich ist, denn es scheint eine Menge Arbeit zu sein, nur um diese eine Sache funktionieren zu lassen.

Da die Dinge, die kurze URLs benötigen, alle realen physischen Dateien auf dem Webserver sind, ist meine derzeitige Lösung, ihre Inode-Nummern zu verwenden, da diese bereits für mich bereit generiert werden und garantiert einzigartig sind.

function short_name($file) { 
    $ino = @fileinode($file); 
    $s = base_convert($ino, 10, 36); 
    return $s; 
} 

Dies scheint zu funktionieren. Frage ist, was kann ich tun, um die kurze URL noch kürzer zu machen?

Auf dem System, auf dem dies verwendet wird, befinden sich die Inodes für neu hinzugefügte Dateien in einem Bereich, in dem die obige Funktion eine 7 Zeichen lange Zeichenfolge zurückgibt.

Kann ich sicher einige (Hälfte?) Der Bits des Inode wegwerfen? Und wenn ja, sollten es die hohen oder die niedrigen Bits sein?

Ich dachte an die Verwendung des crc32 des Dateinamens, aber das macht meine kurzen Namen tatsächlich länger als mit dem inode.

Hätte so etwas Kollisionsgefahr? Ich war in der Lage, zu einzelnen Ziffern zu gehen, indem ich den richtigen Wert von "$ Referencefile" wählte.

function short_name($file) { 
    $ino = @fileinode($file); 
    // arbitrarily selected pre-existing file, 
    // as all newer files will have higher inodes 
    $ino = $ino - @fileinode($referencefile); 
    $s = base_convert($ino, 10, 36); 
    return $s; 
} 

Antwort

13

nicht sicher, dass dies eine gute Idee: Wenn Sie Server ändern müssen, oder Datenträger ändern/neu formatiert es, die Inodes Nummern Ihrer Dateien höchstwahrscheinlich ändern ... Und alle Ihre kurze URL wird gebrochen/hat verloren !

Das Gleiche, wenn Sie aus irgendeinem Grund Ihre Dateien auf eine andere Partition Ihrer Festplatte verschieben müssen, BTW.


Eine weitere Idee könnte sein, etwas crc/md5 berechnen/was auch immer der Name der Datei, wie Sie vorgeschlagen, und einige Algorithmus verwenden, um es „zu verkürzen“.

Hier sind ein paar Artikel darüber:

+2

Guter Punkt. Ein wichtiger Aspekt von URIs ist, dass sie sich nie ändern sollten - http://www.w3.org/Provider/Style/URI - und dies würde sie verletzen. – ceejayoz

+1

Ein weiteres Risiko besteht darin, unbeabsichtigt Zugriff auf Daten zu gewähren, die Sie nicht erwarten. Nehmen wir zum Beispiel an, dass der Benutzer inode 17 anfordert, und das ist zufällig/etc/shadow (oder sie fordern 1111 an, was zufällig eine Verbindung zu/etc/shadow ist). Sie müssen zusätzliche Prüfungen durchführen, um sicherzustellen, dass sich die Datei in dem Verzeichnis befindet, in dem Sie sie erwarten, und es ist möglicherweise nicht ganz trivial ... – atk

0

Check out Lessn von Sean Inman; Hab noch nicht damit gespielt, aber es ist eine selbst gehostete Rolle deine eigene URL-Lösung.

2

Eher clevere Verwendung des Dateisystems dort. Wenn Sie sicherstellen, dass Inode-IDs eindeutig sind, können Sie die eindeutigen Nummern schnell generieren. Ich frage mich, ob dies konsistent über NFS funktionieren könnte, weil offensichtlich unterschiedliche Maschinen unterschiedliche Inode-Nummern haben. Sie würden dann einfach die Link-Informationen in der Datei, die Sie dort erstellen, serialisieren.

Um die URLs ein wenig zu verkürzen, können Sie die Groß-/Kleinschreibung berücksichtigen und eine der sicheren Kodierungen durchführen (Sie erhalten ungefähre Basis62 - 10 [0-9] + 26 (az) + 26) (AZ), oder weniger, wenn Sie einige der "Konflikt" Buchstaben wie I vs l vs 1 entfernen ... es gibt viele Beispiele/Bibliotheken da draußen).

Sie wollen auch Ihre IDs mit einem Offset "nach Hause", wie Sie sagten. Sie müssen auch herausfinden, wie Sie temporäre Datei/Log-Datei, etc Kreation von essen Ihren Schlüsselraum zu halten.