2008-11-03 2 views
2

J'écris une classe C++ simple dans laquelle je voudrais mettre en cache des images de versions d'images téléchargées à partir du Web. En tant que tel, je voudrais utiliser une fonction de hachage qui accepte les chaînes d'URL et génère une chaîne unique appropriée comme nom de fichier.Encoder les URLs dans la chaîne de nom de fichier sécurisée

Existe-t-il un moyen simple de le faire sans réécrire la fonction moi-même? J'ai cherché une bibliothèque simple, mais je n'ai rien trouvé. Sûrement c'est un problème commun.

+0

Merci pour les réponses. Par souci de simplicité, je pense que je vais rester fidèle à l'approche du "underscore". –

Répondre

1

Une approche plus simple consiste à remplacer tout ce qui n'est pas un caractère ou un nombre par un trait de soulignement.

EDIT: Voici une implémentation naïve dans 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] = '_'; 
    } 
} 
+4

Cela semble trop susceptible d'entraîner des collisions. – erickson

+0

Vous pouvez également atteindre des longueurs de fichier maximales – Eclipse

+0

Cela peut également entrer en collision avec la casse de l'insensibilité sous OS X. –

3

Dans une situation similaire, j'ai codé les octets de la clé dans hexadécimal (où, dans votre cas, la clé est le hachage de l'URL). Cela double la taille mais est simple, évite les problèmes possibles avec votre système de fichiers manquant les caractères, et trie dans le même ordre que la clé d'origine.

(Au départ, j'essayé un encodage légèrement colombophile, plus efficace, que je pensais échappé des personnages problématiques, mais le système de fichiers de Mac OS X se révèle être plus fou que je supposais.)

Questions connexes