2009-12-15 39 views
7

Theo chủ đề: các ký tự có thể được sử dụng trong khóa băm hoặc là gì nếu nó ngắn hơn, những ký tự nào không thể sử dụng?Ký tự nào hợp lệ trong khóa băm?

Ngoài ra, có vấn đề gì khi sử dụng các khóa băm dài (như tên đường dẫn đầy đủ) không?

Trả lời

19

Xem How Hashes Really Work để thảo luận về chủ đề này. Trong ngắn hạn, miễn là bạn trích dẫn khóa (không interpolating q {}), bạn có thể sử dụng bất kỳ ký tự nào bạn muốn.

Về câu trả lời của Dana, không, sẽ không mất nhiều thời gian hơn cho các khóa dài hơn để khớp: nó sẽ mất nhiều thời gian hơn để băm khóa, nhưng đó là tất cả.

Để tham khảo, đây là hàm băm trong 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

Bạn có thể sử dụng bất kỳ ký tự nào hợp lệ trong chuỗi. Độ dài cũng không phải là vấn đề. Perl sẽ đối phó với hầu như mọi thứ :)

5

Bạn có thể sử dụng bất kỳ ký tự nào trong khóa băm --- một khóa băm chỉ là một chuỗi. Nhưng đối với một số ký tự bạn cần trích dẫn chuỗi. Nếu nghi ngờ, chỉ cần đặt dấu ngoặc kép quanh phím.

$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 

Không có vấn đề gì đặc biệt khi sử dụng các khóa dài mà bạn chưa có với chuỗi dài.

6

Một điểm không đưa lên được nêu ra là bạn có thể sử dụng bất kỳ hợp lệ chuỗi như một chìa khóa băm. Nếu bạn cố gắng sử dụng một cái gì đó khác hơn là một chuỗi, nó sẽ được tự động chuyển đổi thành chuỗi, có nghĩa là, ví dụ,

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

sẽ sử dụng chuỗi "ARRAY (0xdeadbeef)" (hoặc bất kỳ địa chỉ) là chìa khóa băm, không phải là tham chiếu mảng thực tế.

+0

+1 cho địa chỉ :) –

Các vấn đề liên quan