【问题标题】:Image URL Naming Scheme图片 URL 命名方案
【发布时间】:2014-02-20 21:15:41
【问题描述】:

序言:我正在构建一种 CMS/社交网络服务,它将托管许多图像。

我打算使用 Eucalyptus/Amazon S3 来存储图像,并且想知道 Tumblr、Twitter 等网站使用的看似随机的文件名的重要性,例如

31.media.tumblr.com/d6ba16060ea4dfd3c67ccf4dbc91df92/tumblr_n164cyLkNl1qkdb42o1_500.jpg

pbs.twimg.com/media/Bg7B_kBCMAABYfF.jpg

它们如何生成这些字符串,与仅为每个文件名增加一个整数相比,这会带来什么好处?也许只是随机字符?也许散列一个整数?

谢谢!

【问题讨论】:

    标签: twitter amazon-s3 content-management-system eucalyptus


    【解决方案1】:

    Twitter 使用一种称为“雪花”的编码方法。有github source

    基本格式编码时间戳(42 位)、数据中心 ID(5 位)和工作人员 ID(数据中心的计算机;5 位)

    对于推文 ID,他们将值写入长十进制数。推文 ID“508285932617736192”是十六进制值“070DCB5CDA022000”。前 42 位是时间戳(time_t 值为 070DCB5C + 纪元,1291675244)。接下来的五位是数据中心(在本例中为“1”),接下来的五位是工作人员 ID(“2”)。

    对于图像,它们执行完全相同的操作,但使用 base64 编码(遵循 URL 编码的 RFC 4648 标准;最后两个 base64 字符是连字符和下划线)。

    BwjA8nCCcAAy5zA.jpg 解码为 2014-09-02 20:23:58 GMT,数据中心 #1,工人 #7

    【讨论】:

      【解决方案2】:

      这是一种组织媒体的方法,可以保证如果另一个文件具有相同的文件名,媒体不会被覆盖。例如,如果 Twitter 在其 pbs.twimg.com/media/ 目录中有 100 万张照片,并且这百万张照片中可能有两张被命名为 cat.jpg,那么 Twitter 在上传第二个同名文件或调用文件时会遇到问题其中两个具有相同的名称。结果,Twitter(在其他应用程序中)创建了一种方法来防止数据库混淆这两个文件,并在将文件压缩为更具体的文件名后重命名文件:一组数字、字母和看似随机但逐渐生成的符号。

      在您的 CMS 中,我建议创建某种故障保护以防止两个文件发生冲突,无论是在上传时尝试覆盖另一个文件,还是检索一个与另一个同名的文件。您可以通过几种不同的方式来做到这一点。一种方法是我刚才描述的,重命名文件并创建一个自动递增文件名的系统。 不要以明显的模式生成这些文件名,因为这样所有媒体都可以通过地址栏轻松访问。这是 URL 不可读的另一个原因。

      您也可以在您的上传器中应用file_exists() 功能。这是一个 PHP 函数,用于检查具有特定名称的文件是否已存在于特定目录中。 Read more about that function here.

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        我对tumblr文件命名方案的猜测如下:

        • d6ba16060ea4dfd3c67ccf4dbc91df92 - 图像文件的哈希值,可能是 MD5 或 SHA-1
        • tumblr_n164cyLkNl1qkdb42o1_500.jpg - 几个部分:
        • tumblr_ - 广告网站的明显前缀
        • n164cyLkNl1qkdb42o - 由 2 部分组成,在 '1' 之前有 10 个字符 和 7 之后
        • n164cyLkNl - 图片所属的帖子 ID 的某种散列。可能是自定义字母 Base64 值
        • qkdb42o - tumblr 博客名称的哈希。
        • 然后是数字,在本例中为 '1' - 照片集中的图像数量,如果 这是一张照片,然后就只有“1”。
        • 最后,_500 - 图像的最大宽度(以像素为单位)。

        来源:我从 tumblr 收集了很多图像和标签,结果证明模式很明显。你可以看到相同的博客名称哈希的标记方式是相同的,而具有相同帖子编号哈希的帖子的标签是100%相同的。

        现在,如果有办法将这些散列解码回原始值(假设它们实际上不是散列而是编码值,这不太可能)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-21
          • 2018-03-23
          • 2010-09-17
          • 2010-11-14
          • 2013-08-27
          • 2012-06-06
          • 2012-01-04
          相关资源
          最近更新 更多