2009-03-31 3 views
2

Ich bin ein „File-Sharing-Hosting“ zu schreiben, und ich möchte alle Dateien umbenennen, wenn zu einem eindeutigen Namen hochladen und irgendwie den Überblick über die Namen auf der Datenbank zu halten. Da ich nicht zwei oder mehr Dateien mit dem gleichen Namen haben möchte (was sicher unmöglich ist), suche ich nach einem Algorithmus, der basierend auf Schlüssel oder etwas zufällige Namen für mich generiert.Dateinamen automatisch generiert ohne Kollision

Außerdem will ich nicht einen Namen generieren und die Datenbank durchsucht, um zu sehen, ob die Datei bereits vorhanden ist. Ich möchte sicherstellen, 100% oder 99%, dass der generierte Dateiname wurde nie zuvor von meiner Anwendung erstellt.

Irgendeine Idee, wie ich solche Anwendung schreiben kann?

Antwort

10

Sie könnten einen Hash basierend auf dem Dateiinhalt selbst erstellen. Es gibt zwei gute Gründe, dies zu tun:

  1. Hier können Sie nie zweimal die gleiche Datei speichern - zum Beispiel, wenn Sie zwei Kopien einer Musikdatei, die inhaltlich identisch ist, könnten Sie überprüfen, um zu sehen, ob Sie haben diese Datei bereits gespeichert und speichern sie einfach einmal.

  2. Sie trennen Meta-Daten (Dateiname ist nur Metadaten) aus dem Blob. Sie hätten also ein Speichersystem, das durch den Hash des Dateiinhalts indiziert wird, und Sie verknüpfen dann die Dateimetadaten mit diesem Hash-Suchcode.

Das Risiko zwei Dateien zu finden, die den gleichen Hash berechnen, die zwar nicht die gleichen Inhalte sind, abhängig von der Größe des Hash wäre niedrig, und Sie können diese effektiv mildern, indem vielleicht die Datei-Hashing in Chunks (die dann zu einigen interessanten Speicheroptimierungsszenarien führen könnten: P).

+0

Lesen Sie den folgenden Artikel, wenn Sie etwas tun möchten: http://www.linuxworld.com/cgi-bin/mailto/x_linux.cgi?pagetosend=/export /home/httpd/linuxworld/news/2007/111207-hash.html –

+0

Gibt es einen Grund, warum Quellcodeverwaltungssysteme keine Verbindung in diesem Mannger erkennen? – ojblass

+0

Einige tun. Git benennt alle seine Dateien im internen Repository nach ihren Hashes. –

3

GUIDs sind eine Möglichkeit. Sie sind grundsätzlich garantiert keine Wiederholungen (wenn Sie einen richtigen Zufallsgenerator haben).

1

Der beste Weg ist, einfach einen Zähler zu verwenden. Die erste Datei ist 1, der nächste ist 2, weitere 3 ist, und so weiter ...

Aber es scheint, dass Sie zufällig wollen. Um dies schnell zu tun, können Sie sicherstellen, dass Ihre Zufallszahl größer als die letzte Datei erstellt wird. Sie können die letzte Datei zwischenspeichern und dann Ihre Zufallszahl mit ihrem Nachnamen verrechnen.

file = last_file + random(1 through 10) 
+0

+1, aber ich denke, Sie wollen "zufällig (1 bis 10)" - wenn Sie eine 0 bekommen, würden Sie die gleiche ID wie beim letzten Mal vergeben. –

+0

ja, du hast Recht. Ich habe Ihren Vorschlag in bearbeitet. – carl

2

Sie könnten auch mit der Zeit seit der Epoche anhängen.

3

Die beste Lösung wurde bereits erwähnt. Ich möchte nur ein paar Gedanken hinzufügen.

Die einfachste Lösung ist, einen Zähler zu haben und jede neue Datei zu erhöhen. Dies funktioniert ganz gut, solange nur ein Thread neue Dateien erstellt. Wenn mehrere Threads, Prozesse oder sogar Systeme neue Dateien hinzufügen, werden die Dinge etwas komplizierter. Sie müssen die Erstellung neuer IDs mit Sperren oder ähnlichen Synchronisierungsmethoden koordinieren. Sie können jedem Prozess ID-Bereiche zuweisen, um die Synchronisierungsarbeit zu reduzieren, oder die Datei-ID um eine eindeutige Prozess-ID erweitern.

Eine bessere Lösung könnte darin bestehen, GUIDs in diesem Szenario zu verwenden und sich nicht um die Synchronisierung zwischen Prozessen kümmern.

Schließlich Sie bei einigen zufälligen Daten zu jeder Kennung kann sie schwieriger zu erraten zu machen, wenn dies eine Voraussetzung ist.

Auch coommon speichert Dateien in einer Verzeichnisstruktur, wo der Speicherort einer Datei von ihrem Namen abhängt. Die Datei abcdef1234.xyz könnte als /ab/cd/ef/1234.xyz gespeichert werden. Dies vermeidet Verzeichnisse mit einer großen Anzahl von Dateien. Ich bin mir nicht wirklich bewusst, warum dies getan wird - kann Dateisystem Einschränkungen, Leistungsprobleme sein - aber es ist durchaus üblich. Ich weiß nicht, ob ähnliche Dinge üblich sind, wenn die Dateien direkt in der Datenbank gespeichert sind.