पर्ल में हैश अदिश संदर्भ

कभी-कभी जब काम के साथ हैश, आप देख सकते हैं कुछ अजीब भागों.

यहाँ एक नमूना कार्यक्रम:

#!/usr/bin/perl

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

print "hash: " . %h;

यदि आप इस कार्यक्रम को चलाने पर पर्ल 5.22, उत्पादन के इस कार्यक्रम किया जाएगा पाठ hash: 2/8.

क्या है इस अंश?

जब आप का उपयोग करें ऑपरेटर बिंदु हैश में प्रयोग किया जाता है अदिश के संदर्भ में. print "hash: " . %h; के रूप में ही है print "hash: " . scalar(%h);

स्ट्रिंग 2/8 का परिणाम है अभिव्यक्ति scalar(%h).

स्ट्रिंग 2/8 के बारे में वार्ता की आंतरिक संरचना हैश. इस उपयोग के आंकड़े बाल्टी. यह एक पूरी तरह से आंतरिक रसोई घर है, जो बहुत ही शायद ही कभी की जरूरत है. अंदर हैश आवंटित विशेष वर्गों कहा जाता है बाल्टी में जो डेटा संग्रहीत किया जाता है. क्या लिखा है सही करने के लिए के अंश की संख्या है allochronic बाल्टी. नंबर करने के लिए छोड़ दिया के अंश संख्या है वास्तव में इस्तेमाल किया बाल्टी. जब आप जोड़ें मूल्य जोड़े में एक हैश कुछ बिंदु पर allochronic बकेट की संख्या में वृद्धि हुई है करने के लिए हैश काम किया प्रभावी ढंग से.

यहाँ एक नमूना कार्यक्रम से पता चलता है कि कैसे इन आंकड़ों में परिवर्तन जब जोड़ने के लिए मूल्यों का एक हैश:

#!/usr/bin/perl

use feature qw(say);

my %h;

foreach my $i (1 .. 17) {
    $h{$i} = $i;
    say "$i - " . scalar(%h);
}

यहाँ उत्पादन के इस कार्यक्रम (ध्यान दें कि नहीं हर बार जब आप जोड़ने के एक मूल्य हैश में बढ़ जाती है बकेट की संख्या):

1 - 1/8
2 - 2/8
3 - 3/8
4 - 3/8
5 - 4/8
6 - 4/8
7 - 4/8
8 - 5/16
9 - 5/16
10 - 6/16
11 - 6/16
12 - 6/16
13 - 6/16
14 - 7/16
15 - 8/16
16 - 12/32
17 - 12/32

यह दिलचस्प है कि इन आंकड़ों में अस्थिर कर रहे हैं । यदि आप बार-बार चलाने के लिए इस Perl स्क्रिप्ट, उत्पादन थोड़ा अलग होगा ।

बदलने का काम शुरू करने से पर्ल 5.26

आंतरिक आंकड़ों के हैश की जरूरत है केवल शायद ही कभी. इसलिए, शुरू करने से पर्ल संस्करण 5.26, व्यवहार के हैश में अदिश संदर्भ बदल गया था. अब हैश में अदिश संदर्भ के एक नंबर देता है — जोड़े की संख्या में तत्वों की हैश. और सच कहूँ तो, कि क्या एक उम्मीद करेंगे प्राप्त करने के लिए जब आप का उपयोग एक हैश में अदिश के संदर्भ में.

संस्करण के लिए 5.26 पर्ल प्राप्त करने के लिए संख्या के जोड़े के तत्वों में हैश की जरूरत लिखने के लिए scalar(keys(%h));. पर्ल 5.26 अब इस संख्या में प्राप्त किया जा सकता का उपयोग कर scalar(%h);.

लेकिन अगर किसी को पाने के लिए की जरूरत के एक अंश के साथ आँकड़ों के लिए हैश, यह संभव है करने के लिए का उपयोग कर समारोह bucket_ratio पुस्तकालय से Hash::Util. यहाँ का एक उदाहरण है कि एक कार्यक्रम पर पर्ल संस्करण 5.26 पाठ प्रदर्शित करता hash: 2/8.

#!/usr/bin/perl

use Hash::Util qw(bucket_ratio);

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

print "hash: " . bucket_ratio(%h);

अतिरिक्त आँकड़े पर हैश

यदि हां, तो आप की जरूरत है समझने के लिए क्या हो रहा है के साथ चेसहैम में, यह संभव है करने के लिए अन्य उपकरणों का उपयोग करें. से पर्ल 5.22 पुस्तकालय में Hash::Util समारोह में दिखाई दिया bucket_stats_formatted, यहाँ एक उदाहरण है इसके उपयोग:

#!/usr/bin/perl

use Hash::Util qw(bucket_stats_formatted);

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

print bucket_stats_formatted(\%h);

उत्पादन के इस कार्यक्रम में:

Keys: 2 Buckets: 2/8 Quality-Score: 0.94 (Good)
Utilized Buckets: 25.00% Optimal: 25.00% Keys In Collision: 0.00%
Chain Length - mean: 1.00 stddev: 0.00
Buckets              8 [00000011]
Len   0  75.00%      6 [######]
Len   1  25.00%      2 [##]
Keys                 2 [11]
Pos   1 100.00%      2 [##]

अन्य लेख