Amazon S3 重复数据删除?

xen*_*ndi 5 php hash md5 amazon-s3 duplicates

我目前正在编写一个视频共享网站。对于上传,我使用的是 PHP。我注意到当我上传视频时,S3 会获取文件的 MD5 哈希值。我想知道 S3 是否进行了任何重复数据删除。我上传了几个相同的文件,但没有看到任何内容表明 S3 知道它们是相同的,或者至少它正在做任何事情。

我应该自己实现吗?我有一个 MySQL 数据库,用于存储所有视频信息。我可以对所有视频进行哈希处理,并提供以前上传的文件(如果它们相同)。我可以简单地做md5(tmp-file-here)。这似乎很合适,因为 S3 已经在使用 md5。但是,与针对诸如 BLAKE2 之类的东西进行优化的东西相比,md5 很慢。我应该这样做吗?最好的方法是什么?

Mic*_*bot 8

S3 不会公开任何内部重复数据删除的证据。如果您要上传 500 个相同的文件,每个文件大小为 1 GB,则您需要支付存储 500 GB 的费用。

因此,如果您想考虑对上传的内容进行重复数据删除,则需要推出自己的解决方案,但请考虑以下几点:

标准的 md5 哈希算法并不是 S3 在 ETag 上使用的唯一算法。它还使用嵌套 md5 算法进行分段上传,上传大于 5 GB 时需要该算法,对于较小的文件则可选,并且作为不同分段数上传的两个相同文件不会具有相同的 ETag。(在 HTTP 中,一个 ETag 的范围是一个单一的资源,它只有一个单向约束:如果一个资源发生变化,它的 ETag 必须改变,但不同的 ETag不一定传达任何信息。S3 比 S3 更严格那个,但 ETag 不是一个完美的重复数据删除密钥)。

但重要的是,MD5 不足以或不足以进行重复数据删除。在大多数情况下,MD5 现在被认为是损坏的,因为可以设计碰撞。MD5 只对剩下的一个目的真正有效:验证一个数据 blob 没有被先前已知的 blob 的 MD5 散列意外损坏。它对于确定一个数据块是否被故意损坏没有什么价值。意外损坏导致相同 MD5 散列的几率非常低,但可以设计故意碰撞。SHA-1在实践中也被证明是脆弱的。

由于您将对象位置存储在数据库中,因此您可以灵活地无需立即解决此问题。S3 存储的低成本(约 23 美元/TB/月)使得您不太可能发现这是一个值得追求的东西,至少在一段时间内,如果您这样做了,那么您可以使用任何有意义的算法决定你需要它——扫描对象以寻找相同大小的对象,然后比较这些对象以查看它们是否确实相同,并相应地更新数据库,清理欺骗。

另一种选择——我已经成功使用过——是使用存储桶版本控制并根据对象内容的 SHA-256 实际存储带有密钥的对象。如果您覆盖一个对象并启用版本控制,您仍然可以访问该对象的所有不同版本,但任何未指定 version-id 的下载对象将收到最近上传的内容。如果需要,您可以在采取措施(使用不同的算法)确保您没有发现两个不同的对象发生 SHA-256 冲突后,定期清除这些旧对象。(如果您确实发现了具有 SHA-256 碰撞的不同对象,您将会出名。)