3

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

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

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

pbs.twimg.com/media/Bg7B_kBCMAABYfF.jpg

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

谢谢!

4

3 回答 3

2

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

基本格式编码时间戳(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

于 2020-04-25T12:35:51.080 回答
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% 相同的。

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

于 2015-04-20T14:40:31.727 回答
0

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

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

您也可以file_exists()在上传器中应用该功能。这是一个 PHP 函数,用于检查具有特定名称的文件是否已存在于特定目录中。 在此处阅读有关该功能的更多信息。

希望这可以帮助。

于 2014-02-21T04:58:18.473 回答