图像URL命名方案

问题描述 投票:3回答:3

序言:我正在构建一种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
3个回答
0
投票

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

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

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

希望这会有所帮助。


0
投票

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

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

来源:我已经从tumblr收集了很多图像和标签,而且这种模式很明显。您可以看到相同博客名称哈希的标记方式是如何相同的,而具有相同帖子编号哈希的帖子的标记是100%相同的。

现在,如果只有一种方法可以将这些散列解码回原始值(假设它们实际上不是散列而是编码值,那是不可能的。


0
投票

Twitter使用一种称为'snowflake'的编码方法。有github source

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

对于tweet ID,它们将值写为长十进制数。 Tweet ID'508285932617736192'是十六进制值'070DCB5CDA022000'。前42位是时间戳(time_t值为070DCB5C +历元1291675244)。接下来的五位是数据中心(在本例中为'1'),接下来的五位是工作程序ID('2')。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.