如何为URL生成唯一的哈希?

Jac*_*ine 14 algorithm

鉴于来自twitter的这两张图片.

http://a3.twimg.com/profile_images/130500759/lowres_profilepic.jpg
http://a1.twimg.com/profile_images/58079916/lowres_profilepic.jpg
Run Code Online (Sandbox Code Playgroud)

我想将它们下载到本地文件系统并将它们存储在一个目录中.我该如何克服姓名冲突?

在上面的例子中,我不能将它们存储为lowres_profilepic.jpg.我的设计理念是将URL视为不透明字符串,但最后一段除外.我可以使用哪些算法(实现为f)将前缀散列为唯一字符串.

f( "http://a3.twimg.com/profile_images/130500759/" ) = 6tgjsdjfjdhgf
f( "http://a1.twimg.com/profile_images/58079916/" )  = iuhd87ysdfhdk
Run Code Online (Sandbox Code Playgroud)

这样,我可以将文件保存为: -

6tgjsdjfjdhgf_lowres_profilepic.jpg
iuhd87ysdfhdk_lowres_profilepic.jpg
Run Code Online (Sandbox Code Playgroud)

我不想要一个加密算法,因为它需要一个高效的操作.

Ste*_*n C 16

无论您如何操作(散列,编码,数据库查找),我建议您不要尝试将大量URL映射到大型平面目录中的文件.

原因是大多数文件系统的文件查找涉及对目录中文件名的线性扫描.因此,如果您的所有N个文件都在一个目录中,则查找将平均涉及1/2 N个比较; ie O(N) (请注意,ReiserFS将目录中的名称组织为BTree.但是,ReiserFS似乎是例外而不是规则.)

最好将URI映射到目录树,而不是一个大的平面目录.根据树的形状,查找可以一样好O(logN).例如,如果您组织树以使其具有3级目录,每个目录中最多100个条目,则可以容纳100万个URL.如果您将映射设计为使用2个字符的文件名,则每个目录应该很容易适合单个磁盘块,并且路径名查找(假设所需的目录已经被缓存)应该花费几微秒.

  • 现在,文件系统通常使用树来建立文件结构. (3认同)

ori*_*rip 10

看起来你真正想要的是拥有一个不会与其他人发生冲突的合法文件名.

  • 任何URL编码都可以工作,甚至是base64:例如 filename = base64(url)
  • 加密哈希会给你你想要的东西 - 虽然你声称这将是一个性能瓶颈,但在你进行基准测试之前不确定


gue*_*rda 5

一个非常简单的方法:

f( "http://a3.twimg.com/profile_images/130500759/" ) = a3_130500759.jpg
f( "http://a1.twimg.com/profile_images/58079916/" )  = a1_58079916.jpg
Run Code Online (Sandbox Code Playgroud)

由于此 URL 的其他部分是不变的,因此您可以使用子域(查询路径的最后部分)作为唯一的文件名。

不知道这个解决方案可能存在什么问题

  • 如果 Twitter 更改其图像托管服务器怎么办?就在一年前,个人资料照片还存储在 s3 上。 (2认同)

Sve*_*lov 1

我看到你的问题是对于这个问题最好的哈希算法是什么。您可能想在哈希冲突和字符串性能方面检查此 最佳哈希算法