2009-06-12 19 views
7

क्या अचार हमेशा एक निश्चित इनपुट मूल्य के लिए एक ही आउटपुट उत्पन्न करता है? मुझे लगता है कि शब्दकोशों को चुनते समय एक गोचा जा सकता है जिसमें एक ही सामग्री है लेकिन अलग-अलग सम्मिलित/हटाएं इतिहास। मेरा लक्ष्य एक ज्ञापन कार्यान्वयन के लिए, पिकल और SHA1 का उपयोग करके फ़ंक्शन तर्कों का "हस्ताक्षर" बनाना है।क्या पिकलिंग प्रक्रिया निर्धारक है?

उत्तर

7

मुझे लगता है कि एक ही सामग्री वाले अलग-अलग शब्दकोशों को चुनते समय अलग-अलग सम्मिलित/हटाए गए इतिहासों को चुनते समय गॉचा हो सकता है।

अधिकार:

>>> pickle.dumps({1: 0, 9: 0}) == pickle.dumps({9: 0, 1: 0}) 
False 

यह भी देखें: pickle.dumps not suitable for hashing

मेरा लक्ष्य एक समारोह तर्कों के "हस्ताक्षर" बनाने के लिए अचार और SHA1, का उपयोग कर एक memoize कार्यान्वयन के लिए है।

इसके साथ कई मौलिक समस्याएं हैं। यह एक वस्तु-से-स्ट्रिंग परिवर्तन नक्शे कि समानता वस्तु पहचान की समस्या का सही ढंग से लगता है कि साथ आने के लिए असंभव है:, आप लोगों में वस्तु पदानुक्रम को बदलने के लिए सक्षम हो सकता है

>>> a = object() 
>>> b = object() 
>>> a == b 
False 
>>> pickle.dumps(b) == pickle.dumps(a) 
True 

अपने सटीक आवश्यकताओं के आधार पर कि तब आप हैश:

def hashablize(obj): 
    """Convert a container hierarchy into one that can be hashed. 

    Don't use this with recursive structures! 
    Also, this won't be useful if you pass dictionaries with 
    keys that don't have a total order. 
    Actually, maybe you're best off not using this function at all.""" 
    try: 
     hash(obj) 
    except TypeError: 
     if isinstance(obj, dict): 
      return tuple((k, hashablize(v)) for (k, v) in sorted(obj.iteritems())) 
     elif hasattr(obj, '__iter__'): 
      return tuple(hashablize(o) for o in obj) 
     else: 
      raise TypeError("Can't hashablize object of type %r" % type(obj)) 
    else: 
     return obj 
0

उसी आउटपुट से आपका क्या मतलब है? आपको आम तौर पर हमेशा एक राउंडट्रिप (पिकलिंग -> अनपिक्लिंग) के लिए एक ही आउटपुट प्राप्त करना चाहिए, लेकिन मुझे नहीं लगता कि धारावाहिक प्रारूप को प्रत्येक शर्त में समान होने की गारंटी है। निश्चित रूप से, यह प्लेटफ़ॉर्म और उसके बीच के बीच बदल सकता है।

आपके कार्यक्रम के एक भाग के भीतर, ज्ञापन के लिए पिकलिंग का उपयोग करना ठीक होना चाहिए - मैंने बिना किसी परेशानी के इस योजना का कई बार उपयोग किया है, लेकिन यह काफी सरल समस्याओं के लिए था। एक समस्या यह है कि इसमें हर उपयोगी मामले को शामिल नहीं किया जाता है (फ़ंक्शन दिमाग में आता है: आप उन्हें अचार नहीं कर सकते हैं, इसलिए यदि आपका फ़ंक्शन एक कॉल करने योग्य तर्क लेता है, तो यह काम नहीं करेगा)।

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