如何为nodejs中的上传文件生成简短的唯一名称?

Eri*_*rik 12 file-upload uniqueidentifier node.js

我需要通过简短的唯一标识符来命名上传的文件nYrnfYEv a4vhAoFG hwX6aOr7.我怎样才能确保文件的唯一性?

Ita*_*Ale 17

(发表我的评论作为答案,回答您的疑虑)

您可能想要查看shortid NPM模块,它生成短ID(令人震惊,我知道:))类似于您发布的示例.结果是可配置的,但默认情况下它是一个7到14个字符之间的字符串(长度也是随机的),所有URL友好(A-Za-z0-9\_\-在正则表达式中).

回答你(和其他海报')的担忧:

  • 除非您的服务器具有真正的随机数生成器(极不可能),否则每个解决方案都将使用PRNG(伪随机数生成器).shortid使用Node.js加密模块来生成PRNG数,但是,这是一个比Math.random()更好的生成器
  • shortid不是顺序的,这使得猜测它们变得更加困难
  • 虽然不保证shortid是唯一的,但碰撞的可能性非常小.除非您每年生成数十亿条目,否则您可以放心地认为碰撞永远不会发生.
  • 对于大多数情况,依靠概率来相信碰撞不会发生就足够了.如果您的数据太重要而且风险很小,那么您可以通过在其前面添加时间戳来使短信基本上 100%唯一.作为额外的好处,文件名也将更难猜测.(注意:我写了"基本上100%唯一",因为如果在同一时间戳中生成两个项目,即同一秒,你仍然可能会发生冲突.但是,我永远不会关心这一点.真正100%确定你唯一的选择是对数据库或文件系统进行检查,但这需要更多的资源.)
  • shortid本身不能做到这一点的原因是因为对于大多数应用程序来说,碰撞的可能性太小而不能成为一个问题,并且拥有最短的可能ID更为重要.


x80*_*486 13

一种选择可以是生成唯一标识符(UUID)并相应地重命名文件.

看看kelektiv/node-uuidnpm模块.


例:

$ npm install uuid
Run Code Online (Sandbox Code Playgroud)

...然后在你的JavaScript文件中:

const uuidv4 = require('uuid/v4'); // I chose v4 ? you can select others
var filename = uuidv4(); // '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
Run Code Online (Sandbox Code Playgroud)

无论何时你执行,uuidv4()你都会得到一个非常新鲜的.

注意:还有其他选择/类型的UUID.阅读模块的文档以熟悉它们.


小智 5

非常简单的代码。生成几乎唯一的文件名,或者如果这还不够,您检查文件是否存在

function getRandomFileName() {
var timestamp = new Date().toISOString().replace(/[-:.]/g,"");  
var random = ("" + Math.random()).substring(2, 8); 
var random_number = timestamp+random;  
return random_number;
}
Run Code Online (Sandbox Code Playgroud)


zds*_*asd -5

我认为您可能对真随机和伪随机感到困惑。

伪随机字符串“通常表现出静态随机性,同时是由完全确定性的随机过程生成的”。这意味着,如果您在加密应用程序中使用这些随机值作为熵,则您不想使用伪随机生成器。

然而,对于您的使用,我相信它会很好 - 只需检查潜在的(极不可能的)冲突。

您想要做的就是创建一个随机字符串 - 不确保它 100% 安全且完全随机。