【问题标题】:Encode URLs into safe filename string将 URL 编码为安全的文件名字符串
【发布时间】:2010-09-20 14:08:23
【问题描述】:

我正在编写一个简单的 C++ 类,我想在其中缓存从网络下载的图像的图片缩略图版本。因此,我想使用一个哈希函数,它接受 URL 字符串并输出一个适合作为文件名的唯一字符串。

有没有一种简单的方法可以做到这一点而无需自己重新编写函数?我四处寻找一个简单的图书馆,但找不到任何东西。这肯定是一个常见的问题。

【问题讨论】:

  • 感谢您的回复。为了简单起见,我想我会坚持使用“下划线”的方法。

标签: c++ url caching hash filenames


【解决方案1】:

在类似的情况下,我将密钥的字节编码为十六进制(在您的情况下,密钥是 URL 的哈希值)。这使大小翻了一番,但很简单,避免了文件系统破坏字符时可能出现的任何问题,并且按照与原始键相同的顺序进行排序。

(最初我尝试了一种稍微花哨、更高效的编码,我认为它可以避开任何有问题的字符,但结果证明 OS X 的文件系统比我想象的要疯狂。)

【讨论】:

    【解决方案2】:

    一个更简单的方法是用下划线替换所有不是字符或数字的内容。

    编辑:这是 C 中的一个幼稚实现:

    #include <cctype>
    
    char *safe_url(const char *str) {
        char *safe = strdup(str);
        for (int i = 0; i < strlen(str); i++) {
            if (isalpha(str[i]))
                safe[i] = str[i];
            else
                safe[i] = '_';
        }
    }
    

    【讨论】:

    • 这似乎太可能导致碰撞。
    • 您也可能会遇到最大文件长度
    • 这也可能与 OS X 中的不区分大小写发生冲突。
    【解决方案3】:

    boost::hash 呢?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多