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

时间:2012-09-24 10:41:10

标签: javascript node.js express md5 sha1

我有小图片托管,我意识到有许多重复的内容。我希望将来通过使用校验和或哈希码来消除此问题,其中新上传的文件将被散列,与现有的图像哈希数据库相比,如果它已经存在则被删除并且将向用户呈现现有的图像链接。全部在一个实例中

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

考虑到每个目录中可能存在数千或数百万个文件的可能性,我这样做的最佳(快速和可靠)哈希和数据库设置是什么?我认为MD5或SHA1过度,可能需要大量资源。我想知道是否有更简单的解决方案。

统计数据:
每天上传~1,000张图片
~400 kb平均图像尺寸
服务器中~35,000张图像
〜30%重复内容(使用MD5测试)

2 个答案:

答案 0 :(得分:0)

MD5实际上非常快,足以满足您的使用需求。一个轶事基准测试表明它在单个CPU上的速度约为每秒400 MB(source)。它不会成为服务器处理的瓶颈,也是检查重复文件的可靠方法。 MD5易受碰撞攻击,但必须精心准备;机会碰撞在统计上是不可能的。听起来碰撞在您的应用程序中不会出现太大问题(但请确保无论如何都要处理它们)。

如果你真的只想要速度而不考虑可靠性,你可以选择CRC。它不是一个真正的哈希,只是为了检测字节流中的错误。它具有相对较高的碰撞率,约为百万分之一。然而,它的速度非常快;它意味着在路由器上的硬件中实现。

答案 1 :(得分:0)

以下方法如何:

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

为了将现有图像转换为该结构,我确信使用md5summvln -s的相当简单的shell脚本可以解决问题。

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