2017-02-06 15 views
13

के लिए बहुत तेज़ हैश फ़ंक्शन मुझे एक बहुत तेज स्ट्रिंग हैशिंग फ़ंक्शन की आवश्यकता है, जो PHP में लिखे गए वेब एप्लिकेशन के साथ अच्छी तरह से फिट बैठता है।हैशिंग 8-16 बाइट स्ट्रिंग्स

जिस समस्या को मैं दूर करने की कोशिश कर रहा हूं वह एक एक्सेस कंट्रोल सिस्टम में अनुमतियों को आईडी असाइन कर रहा है। मैं अनुमतियों की आईडी का प्रतिनिधित्व करने के लिए हैश स्ट्रिंग का उपयोग करने के बारे में सोच रहा हूं। इस तरह से मैं इस तरह जिस तरह से अनुमतियों की जाँच करने में सक्षम हो जाएगा:

if ($Auth->isAllowed($user, "blog.comment")) { 
    // Do some operation 
} 
... 

if ($Auth->isAllowed($user, "profile.avatar.change")) { 
    // Do some other operation 
} 

डीबी तालिका अनुमति मैप कर देंगे उपयोगकर्ता की भूमिकाओं के लिए हैश। यह जांचने के लिए कि उपयोगकर्ता को "profile.avatar.change" करने की अनुमति है, संबंधित स्ट्रिंग को डीबी टेबल के विरुद्ध धोया और चेक किया जाएगा।

यह बहुत आसान है और विभिन्न मॉड्यूल के बीच अद्वितीय अनुमति आईडी बनाए रखने के बारे में चिंता करने की आवश्यकता नहीं होगी। लेकिन हैशिंग समारोह बहुत कुशल होना चाहिए।

+1

हैशिंग एक तरफ सड़क है, इसलिए इस तरह के कुछ के लिए, इसके अस्तित्व के अलावा, हैश में आप कुछ भी नहीं देख सकते हैं। –

+0

लिनक्स दृष्टिकोण का पालन करने का सबसे आम तरीका है। (अनुमतियों का प्रतिनिधित्व करने के लिए 0-7 का उपयोग कर)। आईडी को अनुमतियों के लिए असाइन करें और पूर्णांक बनाने के लिए 2^(आईडी संख्या) करें, फिर यह पता लगाने के लिए कि आपके पास कौन सी अनुमतियां हैं ... या बस ऑब्जेक्ट/टोकन को चर के समूह के साथ पास करें और $ user- > can_change_stuff या $ user-> has_apples – Dimi

+0

@apokryfos, यह एक डुप्लिकेट नहीं है। ये सभी प्रश्न मेरा हैं। यह प्रश्न स्ट्रिंग हैशिंग के बारे में अधिक विशिष्ट है। – ezpresso

उत्तर

10

पहला हालांकि था क्यों वह एक साधारण md5 फ़ंक्शन का उपयोग नहीं करता?

अपने आप

most frequently referred function में से एक द्वारा हैश लिखने के लिए कोशिश कर रहा एक सरल हैश बर्नस्टेन की समारोह भी Times 33 with Addition के रूप में करने के लिए भेजा है। इसका उपयोग php में ज़ेंड to make hashes for keys of associative array द्वारा किया जाता है। php में यह इस प्रकार के रूप में लागू किया जा सकता है:

function djb2($s){ 
    $word = str_split($s); 
    $length = count($word); 

    $hashAddress = 5381; 
    for ($counter = 0; $counter < $length; $counter++){ 
     $hashAddress = (($hashAddress << 5) + $hashAddress) + $word[$counter]; 
    } 
    return $hashAddress; 
} 
echo djb2("stackoverflow"); 

समस्या यह है कि जब यह इस तरह से कार्यान्वित किया जाता है, यह नहीं बल्कि धीमी है। टेस्ट से पता चलता है कि यह ~ 3 बार धीमी है, md5 से। इसलिए हमें सबसे तेज़ internal implementation of a hash function मिलना है।

सबसे अच्छा आंतरिक हैश

ढूँढना बस सब algos लेने के लिए और तार के एक लाख हैश करने के लिए समय को मापने।

function testing($algo, $str) { 
    $start = microtime(true); 
    for($ax = 0; $ax < 1000000; $ax++){ 
     hash($algo, $str); 
    } 

    $end = microtime(true); 
    return ($end - $start); 
} 


$algos = hash_algos(); 
$times = []; 

foreach($algos as $algo){ 
    $times[$algo] = testing($algo, "stackoverflow"); 
} 

// sort by time ASC 
asort($times); 

foreach($times as $algo => $time){ 
    echo "$algo -> " . round($time, 2)."sec\n"; 
} 

मेरे परिणाम था:

fnv1a32 -> 0.29sec 
fnv132 -> 0.3sec 
crc32b -> 0.3sec 
adler32 -> 0.3sec 
crc32 -> 0.31sec 
joaat -> 0.31sec 
fnv1a64 -> 0.31sec 
fnv164 -> 0.31sec 
md4 -> 0.46sec 
md5 -> 0.54sec 
... 
md2 -> 6.32sec 

परिणाम थोड़ा निष्पादन के लिए निष्पादन से बदल जाता है - पहले 8 algos फेरबदल कर रहे हैं उनके पास गति और सर्वर लोड पर अपनी निर्भरता की वजह से।

क्या चुना जाना चाहिए?

आप ऊपर दिए गए शीर्ष -8 कार्यों में से कोई भी ले सकते हैं: $hash = hash('crc32', $string);। वास्तव में व्यापक रूप से उपयोग किए जाने वाले md5 फ़ंक्शन नेताओं की तुलना में केवल 1.7 गुना धीमा है।

बोनस

There are another functions like SuperFastHash, कि php कोड में लागू नहीं कर रहे हैं, लेकिन वे तेजी से crc32 4x कर रहे हैं।

2

अधिकांश मामलों में एक हैशिंग फ़ंक्शन के प्रसंस्करण समय को नगण्य माना जा सकता है। यदि आपको थोड़ा हैश (8 वर्ण) की आवश्यकता है, तो आप बस crc32 फ़ंक्शन का उपयोग कर सकते हैं।

<?php 
$hash = hash('crc32', 'WhatDoYouWant'); 
?> 

आप हैश को अनियमित के साथ यादृच्छिक हैश बनाने के लिए भी जोड़ सकते हैं।

<?php 
$hash = hash('crc32', uniqid()); 
?> 
3

xxHash का उपयोग करें। इसका उपयोग प्रेस्टो डीबी द्वारा भी किया जाता है। GitHub

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