2015-05-12 4 views
1

Согласно странице Perl док:Когда Perl «hash» хеширует?

perldata

Хэши неупорядоченные коллекции скалярных значений, проиндексированных по их ассоциированной строки ключа.

Я бы подумал Perl хэши заказал, так как они, как правило, построены с использованием массива:

my %h = ("a",1,"b", 2); 

Если хэши Perl являются неупорядоченными, они должны быть «хэш» -ed, чтобы разрешить доступ. Вопрос в том, когда Perl хэш хеширует?

Если мы делаем:

my %h = ("1",1); #1 
print $h{"1"};  #2 

Я предполагаю, что эта строка # 1 делает хеширование внутренне.

Если хэш строится из массива:

#@a = ("1", 1); 
my %h = @a; 

Я предполагаю, что присваивание% ч делает хеширование.

Пожалуйста, подтвердите правильность моего предположения, и я, кажется, не нашел информацию в любом месте в Интернете.

+3

Это может помочь: http://www.perl.com/pub/2002/10/01/hashes.html –

+7

'(" a ", 1," b ", 2)' на самом деле список, а не массив: http://stackoverflow.com/questions/6023821/perl-array-vs-list –

+0

@huntermcmillen Спасибо за указание, но я не думаю, что здесь основные проблемы – texasbruce

ответ

7

Всякий раз, когда строка используется как хэш-ключ, вычисляется хэш этой строки. Если ключ является константой (например, "a" в $hash{"a"}), то его хэш вычисляется во время компиляции и сохраняется в optree; иначе он вычисляется во время выполнения по мере необходимости. Это относится также к присвоению и извлечению; хеш-ключ используется, чтобы найти правильный хеш-элемент для хранения значения или получения значения из.

+0

Итак, как хэш сохраняется в памяти? Это как хэш-таблица с O (1) временем доступа? Или просто массив с временем доступа O (n)? – texasbruce

+2

@texasbruce это хэш-таблица, таким образом хеширование. И имя. В частности, это таблица с одним хешем с привязанными ведрами и рост таблицы, если любое ведро становится слишком большим. Я подозреваю, что здесь есть ответ, который объясняет структуру более подробно, но я не могу легко найти ее, поскольку я нахожусь на своем телефоне прямо сейчас. – hobbs