亚马逊S3去重?

9

我目前正在编写一个视频分享网站,上传使用的是PHP。我注意到当我上传视频时,S3会对文件进行MD5哈希处理。我想知道S3是否有任何去重功能。我上传了几个相同的文件,并没有看到任何提示表明S3知道它们是相同的,或者至少没有做出任何处理。

我应该自己实现吗?我有一个MySQL数据库,用于存储所有视频信息。我可以对所有视频进行哈希处理,如果它们相同,就提供以前上传的文件。我可以简单地执行md5(tmp-file-here)。这似乎是合适的,因为S3已经在使用md5了。然而,与针对此类事情进行优化的BLAKE2相比,md5速度较慢。我应该怎么做,哪种方法最好?


你们在误判方面有哪些风险?也就是说,如果我们认为两个文件是重复的,但实际上它们并不是,那么会出现什么问题? - Jamie Starke
1个回答

14

S3不会公开展示内部去重的任何证据。如果您上传了500个每个1GB的相同文件,存储500GB将被计费。

因此,如果您想考虑去重上传的内容,您需要自己解决问题,但请考虑以下几点:

标准的md5哈希算法不是S3在ETags上使用的唯一算法。它还为分块上传使用了一个嵌套MD5算法,对于大于5 GB的上传是必需的,对于较小的文件是可选的,以及两个上传的相同文件作为不同数量的部件将不具有相同的ETag。(在HTTP中,ETag的范围是单个资源,它只有单向约束:如果资源发生更改,则其ETag必须更改,但不同的ETag不一定传达任何信息。S3比那严格得多,但ETag不是完美的去重键)。

但是,MD5不足或不适用于去重。由于可以工程化碰撞,MD5现在被认为对于大多数目的而言都已经破裂。MD5实际上仅对于一个剩余的目的有效:验证一大块数据没有从之前已知的MD5哈希值的块中意外损坏。对于确定数据块是否已被故意损坏,它几乎没有价值。发生意外损坏导致相同的MD5哈希值的可能性极低,但可以工程化碰撞。SHA-1在实践中也proven存在漏洞。

由于您正在数据库中存储对象位置,因此您有灵活性不需要立即解决此问题。S3存储的低成本(每TB月费用约为23美元)使得您在一段时间内可能不会发现这是值得追求的,如果确实需要,则可以在决定需要时使用任何合适的算法 - 扫描对象以查找相同大小的对象,然后比较这些对象以确定它们是否确实相同,并相应地更新数据库,清除重复项。

另一个选择 - 我曾经成功使用过的选择 - 是使用桶版本控制,并根据其内容的SHA-256存储对象。如果覆盖对象并启用了版本控制,则仍然可以访问对象的所有不同版本,但未指定版本ID下载对象的任何人都将收到最新的上传。如果需要,您可以定期清除这些旧对象,在采取步骤(使用不同的算法)确保您没有发现具有SHA-256冲突的两个不同对象之后进行清除。(如果您确实发现SHA-256冲突的不同对象,那么您将成为名人。)


也许使用带有S3后端的https://perkeep.org是您想要的?它将是SHA224并具有其他一些好处。 - nicocesar
是的,这是很久以前的事了。自那时以来,有许多与S3兼容的令人惊叹的解决方案出现,可以处理这个问题,对我来说已经不是问题了。至于哈希,如果有人对我认为是滚动/编码的最佳解决方案感兴趣,那就是块的blake2哈希(而不是完整的文件)。 - xendi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接