图像URL命名方案

时间:2014-02-20 21:15:42

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

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

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

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

pbs.twimg.com/media/Bg7B_kBCMAABYfF.jpg

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

基本格式编码一个时间戳(42位),数据中心id(5位)和worker 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

答案 1 :(得分:0)

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

在您的CMS中,我建议创建某种故障安全措施,以防止两个文件发生冲突,是否有人在上传时尝试写入另一个文件,或者它是否正在检索一个具有相同名称的文件作为另一个。您可以通过几种不同的方式完成此操作。一种方法就像我刚才描述的那样,重命名文件并创建一个自动递增文件的系统。名。 不要以明显的模式生成这些文件名,因为这样可以通过地址栏轻松访问所有媒体。这是URL不可读的另一个原因。

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

希望这会有所帮助。

答案 2 :(得分:0)

我对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%相同。

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