Какие символы допустимы в хеш-ключах? - PullRequest
8 голосов
/ 15 декабря 2009

По предмету: какие символы можно использовать в хеш-ключах или, если короче, то какие нельзя использовать?

Кроме того, есть ли проблемы в использовании длинных хеш-ключей (например, полных путей)?

Ответы [ 4 ]

19 голосов
/ 15 декабря 2009

См. Как на самом деле работают хеши для обсуждения этой темы. Короче говоря, пока вы цитируете ключ (без интерполяции q {}), вы можете использовать любые символы, которые захотите.

Что касается ответа Даны, нет, для сопоставления более длинных ключей не потребуется больше времени: для хеширования ключа потребуется гораздо больше времени, но это все.

Для справки, это функция хеширования в 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
7 голосов
/ 15 декабря 2009

Единственное, что еще не затронуто, - это то, что вы можете использовать любую действительную строку в качестве хеш-ключа. Если вы попытаетесь использовать что-то отличное от строки, оно будет автоматически преобразовано в строку, что означает, например,

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

будет использовать строку «ARRAY (0xdeadbeef)» (или любой другой адрес) в качестве ключа хеша, а не фактическую ссылку на массив.

6 голосов
/ 15 декабря 2009

Вы можете использовать любой символ, который является допустимым в строке. Длина тоже не проблема. Perl справится практически со всем:)

5 голосов
/ 15 декабря 2009

Вы можете использовать любой символ в хеш-ключе --- хеш-ключ - это просто строка. Но для некоторых символов вам нужно заключить в кавычки строку. Если сомневаетесь, просто заключите в кавычки ключ.

$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

Нет особых проблем с использованием длинных ключей, которых у вас еще нет с длинными строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...