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

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

(发表我的意见作为回答,回应你的顾虑)

您可能想要查看shortid NPM模块,它会生成与您正在发布的示例类似的简短ID(令人震惊,我知道:)。 结果是可configuration的,但是默认情况下它是一个7到14个字符的string(长度是随机的),所有URL友好的(正则expression式)。

为了回答你(和其他海报)的关注:

  • 除非你的服务器有一个真正的随机数发生器(极不可能),否则每个解决scheme都将使用一个PRNG(伪随机数发生器)。 shortid使用Node.jsencryption模块来生成PRNG数字,然而,这是一个比Math.random()更好的生成器。
  • shortid不是连续的,这使得猜测它们更加困难
  • 虽然shortid不能保证是唯一的,碰撞的可能性是非常小的。 除非您每年生成数十亿条条目,否则您可以放心地认为碰撞永远不会发生。
  • 在大多数情况下,依靠概率来相信碰撞不会发生就足够了。 如果你的数据太重要了,即使这么小的风险,你也可以通过给它加上一个时间戳来使shortid 基本上是 100%唯一的。 作为一个额外的好处,文件名将更难以猜测。 (注意:我写了“基本上是100%独特的”,因为如果在同一个时间戳中生成两个条目,理论上可能会发生冲突,也就是说同一秒。但是,我绝对不会关心这个。真正100%确定你唯一的select是对数据库或文件系统进行检查,但是这需要更多的资源。)
  • shortid之所以不能做到这一点,是因为对于大多数应用来说,碰撞的可能性太小而不被关注,拥有尽可能短的id更重要。

你需要一些东西来生成唯一的标识符:UUID; 看看这个npm 模块 。 不知道为什么你需要短名称,但在任何时候你可以缩短返回的UUID到你想要的字符数。

例:

 $ sudo npm install node-uuid 

…然后在你的JavaScript文件中:

 var uuid = require('node-uuid'); // Generate a v4 (random) UUID var filename = uuid.v4(); // filename -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' 

任何时候,你执行uuid.v4()你会得到一个非常新鲜的 。 之后,如果你不喜欢那些冗长的名字,你可以修剪成X字符。

尝试下面的代码片段: –

  function getRandomSalt() { var milliseconds = new Date().getTime(); var timestamp = (milliseconds.toString()).substring(9, 13) var random = ("" + Math.random()).substring(2, 8); var random_number = timestamp+random; // string will be unique because timestamp never repeat itself var random_string = base64_encode(random_number).substring(2, 8); // you can set size here of return string var return_string = ''; var Exp = /((^[0-9]+[az]+)|(^[az]+[0-9]+))+[0-9a-z]+$/i; if (random_string.match(Exp)) { //check here whether string is alphanumeric or not return_string = random_string; } else { return getRandomSalt(); // call recursivley again } return return_string; } 

根据您的要求,文件名可能包含唯一性的字母数字名称。 基于当前时间的时间戳概念的唯一名称,因为当前时间不再重复自己,为了使它强大,我已经应用了base64encode将它转换成字母数字。

  var file = req.files.profile_image; var tmp_path = file.path; var fileName = file.name; var file_ext = fileName.substr((Math.max(0, fileName.lastIndexOf(".")) || Infinity) + 1); var newFileName = getRandomSalt() + '.' + file_ext; 

谢谢

我想你可能会对真随机和伪随机感到困惑。

伪随机string“典型地performance为统计随机性,而由完全确定性的临时过程产生”。 这意味着,如果您将这些随机值用作密码应用程序中的熵,则不需要使用伪随机生成器。

但是,为了您的使用,我相信这样会很好 – 只要检查潜在(极不可能)的冲突。

所有你想要做的是创build一个随机string – 不确保它是100%安全和完全随机的。