php - 亚马逊 S3 重复数据删除?

标签 php amazon-s3 hash duplicates md5

<分区>

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

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

最佳答案

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

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

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

但重要的是,MD5 不足以或不足以进行重复数据删除。 MD5 现在在大多数情况下被认为是损坏的,因为可以设计冲突。 MD5 只对一个剩余目的有效:验证数据 blob 没有被 blob 的先前已知 MD5 散列意外损坏。它对于确定数据 block 是否被故意损坏没有多大值(value)。导致相同 MD5 散列的意外损坏的可能性极低,但可以设计故意的碰撞。 SHA-1 也被proven在实践中很脆弱。

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

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

关于php - 亚马逊 S3 重复数据删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46261533/

相关文章:

php - 如何在 Codeigniter 中插入动态数据?

python - AWS使用Lambda将文件从S3存储桶下载到Windows本地目录

amazon-web-services - AWS S3 同步 --delete,删除本地的新文件

amazon-s3 - 授予 S3 对 Elastic Beanstalk 实例的访问权限

java - 如何在 Java 哈希表中将值添加到值数组中

c - 数组索引的散列

开放简历 |筛选冲浪 |散列 |图片搜索

PHP Regex - 最少 8 个字符,1 个字母,1 个数字

php - Laravel Eloquent ORM - 是否可以设置默认选择列列表?

php - Yii:如何远程连接到数据库?