2009-12-15 6 views
7

Comme par le sujet: quels sont les caractères qui peuvent être utilisés dans les clés de hachage ou, si elles sont plus courtes, lesquelles ne peuvent pas être utilisées?Quels caractères sont valides dans les clés de hachage?

L'utilisation de longues clés de hachage (comme les noms de chemin d'accès complet) pose-t-elle également des problèmes?

Répondre

19

Voir How Hashes Really Work pour une discussion sur ce sujet. En bref, tant que vous citez la clé (q {} non interpolant), vous pouvez utiliser les caractères que vous voulez. En ce qui concerne la réponse de Dana, non, cela ne prendra pas plus de temps pour que des clés plus longues soient appariées: cela prendra infiniment plus de temps pour hacher la clé, mais c'est tout.

Pour référence, c'est la fonction de hachage en Perl 5.10.0:

#define PERL_HASH(hash,str,len) 
STMT_START { 
    register const char * const s_PeRlHaSh_tmp = str; 
    register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; 
    register I32 i_PeRlHaSh = len; 
    register U32 hash_PeRlHaSh = PERL_HASH_SEED; 
    while (i_PeRlHaSh--) { 
     hash_PeRlHaSh += *s_PeRlHaSh++; 
     hash_PeRlHaSh += (hash_PeRlHaSh << 10); 
     hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); 
    } 
    hash_PeRlHaSh += (hash_PeRlHaSh << 3); 
    hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); 
    (hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); 
} STMT_END 
6

Vous pouvez utiliser n'importe quel caractère valide dans une chaîne. La longueur n'est pas un problème non plus. Perl va gérer à peu près n'importe quoi :)

5

Vous pouvez utiliser n'importe quel caractère dans une clé de hachage --- une clé de hachage est juste une chaîne. Mais pour certains caractères, vous devez citer la chaîne. En cas de doute, il suffit de mettre des guillemets autour de la clé.

$hash{simplekey}        # fine 
$hash{/var/log/auth.log}      # syntax error --- can't use '/' directly 
$hash{"/var/log/auth.log"}     # quoted string, so can use any character 
my $key = "/var/log/auth.log"; $hash{$key} # variable used, which can contain any character 

Il n'y a pas de problème particulier avec l'utilisation de longues touches que vous n'avez pas déjà avec de longues chaînes.

6

Un point non élevé encore est que vous pouvez utiliser une chaîne valide comme une clé de hachage. Si vous essayez d'utiliser autre chose qu'une chaîne, il sera automatiquement de chaîne de caractères, ce qui signifie que, par exemple,

my $ref = []; 
$hash{$ref} = 'foo'; 

utilisera la chaîne « MATRICE (0xdeadbeef) » (ou autre adresse) comme la clé de hachage, pas la référence réelle du tableau.

+0

+1 pour l'adresse :) –

Questions connexes