web-dev-qa-db-ja.com

nodejsでアップロードされたファイルの短い一意の名前を生成する方法は?

アップロードしたファイルには、nYrnfYEva4vhAoFGhwX6aOr7のような短い一意の識別子で名前を付ける必要があります。ファイルの一意性を確保するにはどうすればよいですか?

13
Erik

(私のコメントを回答として投稿し、懸念事項への対応も含めて)

shortid NPMモジュールをチェックすると、例として投稿したものと同様の短いID(驚くほど、私は:)を生成します。結果は構成可能ですが、デフォルトでは7〜14文字(長さもランダム)の文字列で、すべてURLに対応しています(正規表現ではA-Za-z0-9\_\-)。

あなた(および他のポスター)の懸念に答えるには:

  • サーバーに真の乱数ジェネレーターがない場合(可能性は非常に低い)を除き、すべてのソリューションはPRNG(疑似乱数ジェネレーター)を使用します。 shortidはNode.js暗号モジュールを使用してPRNG数を生成しますが、Math.random()よりもはるかに優れたジェネレーターです。
  • shortidは連続的ではないため、推測がさらに難しくなります
  • Shortidは一意であることが保証されていませんが、衝突の可能性は非常に小さいです。年間数十億のエントリを生成しない限り、衝突は決して起こらないと安全に想定できます。
  • ほとんどの場合、衝突が起こらないことを信頼する確率に依存することで十分です。データが非常に重要であるため、そのわずかな量でもリスクを冒す場合は、タイムスタンプを付加するだけで、shortidを基本的に100%一意にすることができます。追加の利点として、ファイル名も推測が難しくなります。 (注:2つのアイテムが同じタイムスタンプ、つまり同じ秒で生成された場合、理論的には衝突が発生する可能性があるため、「基本的に100%一意」と書きました。ただし、これについて心配することはありません。実際の100%の確実性は、データベースまたはファイルシステムに対してチェックを実行することのみが選択肢ですが、これにはより多くのリソースが必要です。)
  • Shortidがそれだけではそれを行わない理由は、ほとんどのアプリケーションにとって、衝突の可能性が小さすぎて問題になることはなく、可能な限り最短のIDを持つことがより重要だからです。
18
ItalyPaleAle

1つのオプションは、一意の識別子(UUID)を生成し、それに応じてファイルの名前を変更することです。

_kelektiv/node-uuid_ npmモジュールをご覧ください。


例:

_$ npm install uuid
_

...次にJavaScriptファイルで:

_const uuidv4 = require('uuid/v4'); // I chose v4 ‒ you can select others
var filename = uuidv4(); // '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
_

uuidv4()を実行すると、very-fresh-new-oneが表示されます。

注意:UUIDには他の選択肢/タイプがあります。それらに慣れるためにモジュールのドキュメントを読んでください。

13
x80486