2014-10-11 36 views
0

我有1000万个网页网址,我想将它们的HTML保存为一个文件。操作系统在我的文件名中可以​​使用的限制很多。我想要一些系统将URL映射到字母数字表示,以便以低概率生成重复条目的键值数据库中存储。我需要一个可扩展的解决方案,那就是无论是:到文件名转换的网址

  1. 一些编码方案(Windows为例子,有一个文件名可以是多长时间也是如此大的URL可以产生很大的编码字符串限制)

  2. stdlib的某些功能很可能会产生重复项(并且在键值数据库中映射random_string => url_path)。

我想出了以下解决方案:

  • 使用base64编码。这会为大型网址产生大字符串。
  • 使用安全随机生成urlsafe base64。我不知道有多少组合,直到我得到重复的条目。

回答

1

我认为SHA十六进制表示是在这样的情况下,标准的方式。它给出了一个固定的长度。

sha = Digest::SHA1.file(file).hexdigest 
+0

Digest :: SHA1.hexdigest'foo'似乎是用于字符串的。如果我想从SHA1哈希中恢复到普通的'foo'中,该怎么办? – daremkd 2014-10-11 14:22:07

+0

由于您提到了Secure Random,我解释说您不需要从转换后的名称中取回原始字符串。如果情况并非如此,那么你的问题是误导或无意义的。 – sawa 2014-10-11 14:58:16

0

尝试

md5(base64(filename))  

它应该足够独特:)

+1

你认为'base64'给派对带来了什么? – pguardiario 2014-10-11 03:03:03

1

保存到磁盘将成为一个不断增长的令人头痛的问题。相反,你需要使用更好的设计来达到目的;您应该将HTML保存到数据库。你的查询速度会快很多,名字根本就不重要。即使SQLite也可以很好地处理这个任务。

您需要一个实际URL的字段,一个用于友好名称,通常是页面的标题,另一个用于实际的HTML内容。

我建议看看使用Sequel宝石,这将使这项任务非常简单。查看他们的文档以获取更多信息和工作示例。