避免在Node.js服务器上重复内容

我有小型图像托pipe,我意识到有很多重复的内容。 我想在将来通过使用校验和或者散列代码来消除这个问题,新加载的文件将被散列,与现有的图像散列数据库相比,如果它已经存在,用户将被显示现有的图像链接。 所有在一个例子

我的设置是准系统Node.js + jQueryfile upload +2目录(一个用于论坛上传,另一个用于直接网页上传)。

什么是最好的(快速和可靠的)散列和数据库设置为了做到这一点考虑到可能在每个目录中有数千或百万个文件? 我认为MD5或SHA1是矫枉过正,可能需要大量的资源。 我想知道是否有更简单的解决scheme。

统计:
〜每天上传1000张图片
〜400 kb平均图像大小
在服务器中〜35,000图像
〜30%的重复内容(使用MD5进行testing)

MD5实际上相当快,足以满足您的使用情况。 一个轶事基准testing表明,在单个CPU( 源 )上,每秒大约有400兆字节。 这不会是你的服务器处理的瓶颈,而且是检查重复文件的可靠方法。 MD5很容易受到碰撞攻击,但是必须精心准备; 偶然的碰撞是统计上不可能的。 这听起来像碰撞不会在你的应用程序的问题太大(但要确保你处理它们)。

如果你真的只想加速排除可靠性,你可以去CRC。 它并不是一个真正的散列,只是为了检测字节stream中的错误。 它有一个百万分之一的相对较高的碰撞率。 然而,这是快速的; 它意味着在路由器硬件上实现。

以下方法如何:

  • 当用户上传图片时,会创buildMD5和
  • 然后使用该MD5和作为文件名存储图像
  • 原始图像名称也存储在FS上,但作为指向MD5名称的符号链接。
  • 如果用户上传的图片是重复的,那么您可以检查MD5名称是否已经存在,只需创build符号链接即可。

为了将现有的图像转换成这种结构,我相信一个相当简单的使用md5summvln -s shell脚本可以做到这一点。

另一种可能是使用类似于MongoDB的东西来将图像存储在数据库中,这可能更容易聚类。