सी

2012-07-26 3 views
6

में मेमोरी पतों के सही या सही हैश के पास 0xc0003000 से 0xc04a0144 तक मेमोरी पतों की एक सूची है, सूची में कई अंतराल और < 4096 प्रविष्टियां हैं। यह संकलन समय पर जाना जाता है और मैं इसके लिए एक आदर्श हैश बनाना चाहता हूं।सी

हालांकि सही हैशिंग ऑनलाइन देखकर मुझे अधिकतर जानकारी हैशिंग स्ट्रिंग से संबंधित है और वे अच्छी तरह से अनुवाद नहीं कर रहे हैं।

स्पष्ट होने के लिए मैं रन टाइम पर मेमोरी एड्रेस प्राप्त करने में सक्षम होना चाहता हूं और जांच सकता हूं कि यह हैश में जल्दी है। वर्तमान में मैं एक बाइनरी खोज का उपयोग कर रहा हूं जो उत्तर खोजने के लिए औसत 8 लूप पर है।

कोई विचार क्या पेड़ मुझे छाल देना चाहिए?

+0

कैसे को संतुलित पेड़, बी पेड़ या लाल-काले की तरह के बारे में के साथ परीक्षण? – Rsh

+0

क्या आपने 'बिट्ससेट 'का प्रयास किया था? – jxh

+0

मुझे लगता है कि रेडिक्स पेड़ स्पैस पूर्णांक मूल्य खोज के लिए सबसे अच्छा खोज पेड़ है। –

उत्तर

3

यहां एक नमूना gperf प्रोग्राम है। मैंने साबित करने के लिए नमूना डेटा में एक एनयूएल और एक नई लाइन शामिल की है कि वे इसे असफल होने का कारण नहीं बनाते हैं।

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <inttypes.h> 
#include <arpa/inet.h> 
%} 
%% 
"\xc0\x01\x02\x03" 
"\xc0\xff\xff\xff" 
"\xc0\xff\x00\xff" 
"\xc0\x0a\xff\xff" 
%% 
int main(int argc, const char **argv) 
{ 
    int i; 

    for(i=1;i<argc;++i) { 
     uint32_t addr = ntohl(strtoul(argv[i], 0, 16)); 
     if(in_word_set((char *)&addr, 4)) 
      printf("0x%08"PRIx32" is in the list.\n", htonl(addr)); 
     else 
      printf("0x%08"PRIx32" is not in the list.\n", htonl(addr)); 
    } 
    return 0; 
} 

सहेजें addrs.gperf के रूप में, संकलन और

gperf -l addrs.gperf > addrs.c 
gcc addrs.c -o addrs 
./addrs c0000000 c0010203 c0ffffff c00affff c0ff0aff c0ffff00 c0ff00ff 
+0

यह बहुत साफ दिखता है, और थोड़ी तेज़ी से चलाता है, अगर वास्तव में इस उद्देश्य के लिए जीपीआरएफ का इस्तेमाल किया गया था। –

+1

यह मैं जो कर रहा था उसके लिए यह अच्छी तरह से काम करता है और बाइनरी खोज (10,000,000 लूप) से लगभग 40% तेज है। रेडिक्स पेड़ बाइनरी खोज के बराबर होने के समाप्त हो गया, यह मामूली बेहतर था। –