序言:我正在构建一种CMS /社交网络服务,将托管许多图像。
[我打算使用Eucalyptus / Amazon S3存储图像,并想知道Tumblr,Twitter等站点使用的看似随机文件名的重要性
31.media.tumblr.com/d6ba16060ea4dfd3c67ccf4dbc91df92/tumblr_n164cyLkNl1qkdb42o1_500.jpg
和
pbs.twimg.com/media/Bg7B_kBCMAABYfF.jpg
它们如何生成这些字符串,与仅为每个文件名增加一个整数相比,这有什么好处?也许只是随机字符?也许哈希一个整数?
谢谢!
这是一种组织媒体的方法,可以确保如果另一个文件具有相同的文件名,则不会覆盖媒体。例如,如果Twitter的pbs.twimg.com/media/
目录中有一百万张照片,并且有可能在这两张照片中有两张被命名为cat.jpg
,则Twitter会遇到一个问题,即上传具有相同名称的第二个文件或调用一个文件其中两个存在相同的名称。结果,Twitter(以及其他应用程序)创建了一种防止数据库混淆这两个文件的方法,结果是在将文件压缩为更具体的文件名后重命名了文件:一组数字,字母和符号看似随机,但会逐渐生成。
[在您的CMS中,我建议创建某种故障保护以防止两个文件冲突,无论是上载时试图覆盖另一个文件,还是要检索一个与另一个相同名称的文件。您可以通过几种不同的方式进行操作。正如我刚才所描述的,一种方法是重命名文件并创建一个自动递增文件名的系统。 不要以明显的方式生成这些文件名,因为这样可以通过地址栏轻松访问所有媒体。这是URL无法读取的另一个原因。
您还可以在您的上传器中应用file_exists()
功能。这是一个PHP函数,用于检查特定目录中是否已经存在具有特定名称的文件。 Read more about that function here.
希望这会有所帮助。
我对tumblr文件命名方案的猜测如下:
来源:我已经从tumblr收集了很多图像和标签,而且这种模式很明显。您可以看到相同博客名称哈希的标记方式是如何相同的,而具有相同帖子编号哈希的帖子的标记是100%相同的。
现在,如果只有一种方法可以将这些散列解码回原始值(假设它们实际上不是散列而是编码值,那是不可能的。
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