2009-12-15 11 views
7

विषय के अनुसार: हैश कुंजी में उपयोग किए जा सकने वाले वर्ण क्या हैं या यदि यह छोटा है, तो किस का उपयोग नहीं किया जा सकता है?हैश कुंजी में कौन से वर्ण मान्य हैं?

इसके अलावा, क्या हैश कुंजी (जैसे पूर्ण पथ नाम) का उपयोग करने में कोई समस्या है?

उत्तर

19

इस विषय पर चर्चा के लिए How Hashes Really Work देखें। संक्षेप में, जब तक आप कुंजी (गैर-इंटरपोलिंग क्यू {}) उद्धृत करते हैं, तब तक आप जो भी पात्र चाहते हैं उसका उपयोग कर सकते हैं।

दाना के उत्तर के संबंध में, नहीं, इसमें मिलान करने के लिए लंबी चाबियों के लिए अधिक समय नहीं लगेगा: यह कुंजी को हैश करने के लिए अधिक समय तक ले जाएगा, लेकिन यह सब कुछ है।

#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

आप स्ट्रिंग में मान्य किसी भी वर्ण का उपयोग कर सकते हैं। लंबाई या तो कोई मुद्दा नहीं है। पर्ल कुछ भी के साथ सामना करेगा :)

5

आप हैश कुंजी में किसी भी चरित्र का उपयोग कर सकते हैं --- एक हैश कुंजी सिर्फ एक स्ट्रिंग है। लेकिन कुछ पात्रों के लिए आपको स्ट्रिंग को उद्धृत करने की आवश्यकता है। यदि संदेह है, तो कुंजी के चारों ओर उद्धरण डालें।

$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 

लंबी चाबियों का उपयोग करने में कोई विशेष समस्या नहीं है जो आपके पास लंबे तारों के साथ पहले से नहीं है।

6

एक बात अभी तक लाया नहीं है कि आप एक हैश कुंजी के रूप में किसी भी मान्य स्ट्रिंग का उपयोग कर सकते है:

के लिए, इस पर्ल 5.10.0 में हैशिंग कार्य है। आप एक स्ट्रिंग के अलावा कुछ उपयोग करने का प्रयास करते हैं, तो यह स्वचालित रूप से stringified किया जाएगा, जिसका मतलब है, उदाहरण के लिए,

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

हैश कुंजी के रूप में स्ट्रिंग "सरणी (0xdeadbeef)" (या जो भी पता) का उपयोग करेगा, वास्तविक सरणी संदर्भ नहीं। पता के लिए

+0

+1 :) –

संबंधित मुद्दे