9
votes

Quels caractères sont valables dans les clés de hachage?

Selon le sujet: Quels sont les personnages qui peuvent être utilisés dans les clés de hachage ou, s'il est plus court, lesquels ne peuvent pas être utilisés?

Aussi, y a-t-il des problèmes dans l'utilisation de longues clés de hachage (comme des noms de chemin complets)?


0 commentaires

4 Réponses :


6
votes

Vous pouvez utiliser n'importe quel caractère qui est valide dans une chaîne. La longueur n'est pas une question non plus. Perl va faire face à peu près n'importe quoi :)


0 commentaires

5
votes

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 citations 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


0 commentaires

19
votes

voir Comment les hashest fonctionnent vraiment pour une discussion sur ce sujet. En bref, tant que vous citez la clé (q {} non interpolant q {}), vous pouvez utiliser tous les caractères que vous souhaitez.

Concernant la réponse de Dana, non, il ne faudra pas plus longtemps pour que les clés plus longues puissent être assorties: prendra infinimentimalement à hachage la clé, mais c'est tout. p>

Pour référence, il s'agit de la fonction de hachage dans Perl 5.10.0: p>

#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


0 commentaires

7
votes

Un point non soulevé n'est pas encore que vous pouvez utiliser une chaîne valide em> comme clé de hachage. Si vous essayez d'utiliser quelque chose d'autre qu'une chaîne, il sera automatiquement rigoureux, ce qui signifie que, par exemple,

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


0 commentaires