2010-02-12 14 views
7

मैं एक हैश फ़ंक्शन पारिवारिक जनरेटर ढूंढ रहा हूं जो पैरामीटर के सेट दिए गए हैश फ़ंक्शन का एक परिवार उत्पन्न कर सकता है। मुझे अब तक ऐसा कोई जनरेटर नहीं मिला है। क्या hashlib पैकेज के साथ ऐसा करने का कोई तरीका है?हैश फ़िथन में परिवार जनरेटर

h1 = hash_function(1) 
h2 = hash_function(2) 
... 

और h1 और h2 अलग हैश फंक्शन होगा:

उदाहरण के लिए मैं कुछ ऐसा करना चाहते हैं।

आप में से जो लोग इसके बारे में जानते हैं, मैं एक बहुत बड़े डेटासेट पर एक मिनी-हैशिंग एल्गोरिदम लागू करने की कोशिश कर रहा हूं।

असल में, मेरे पास किसी दिए गए दस्तावेज़ के लिए सुविधाओं का एक बहुत बड़ा सेट (100 मिलियन से 1 बिलियन) है, और मुझे सुविधाओं के इस सेट के लिए 1000 से 10000 विभिन्न यादृच्छिक क्रमपरिवर्तन बनाने की आवश्यकता है।

मैं यादृच्छिक क्रमपरिवर्तन स्पष्ट रूप से निर्माण करने के लिए इतना तकनीक मैं में उपयोग करना चाहते हैं नहीं करना चाहती है:

  1. एक हैश समारोह h पैदा करते हैं और मानते हैं कि दो सूचकांक r और s
  2. r के लिए क्रमशः s पर क्रमशः h(r) < h(s) पर दिखाई देता है और यह 100 से 1000 विभिन्न हैश फ़ंक्शंस के लिए करता है।

क्या कोई ज्ञात पुस्तकालय हैं जिन्हें मैं याद कर सकता हूं? या हैश के परिवारों को पाइथन के साथ उत्पन्न करने का कोई मानक तरीका जिसे आप जानते हो?

उत्तर

6

मैं बस की तरह कुछ करना चाहते हैं (यदि आप धागे की सुरक्षा की जरूरत नहीं है - मुश्किल नहीं बदलने के लिए अगर आप धागा सुरक्षा की जरूरत है - और एक 32-बिट अजगर संस्करण कल्पना करते हुए):

import random 

_memomask = {} 

def hash_function(n): 
    mask = _memomask.get(n) 
    if mask is None: 
    random.seed(n) 
    mask = _memomask[n] = random.getrandbits(32) 
    def myhash(x): 
    return hash(x)^mask 
    return myhash 
+1

इस उत्तर के लिए धन्यवाद। ऐसा लगता है कि यह बहुत अच्छा काम करता है। हैश फ़ंक्शंस का उपयोग करने के लिए कोई विशेष? दक्षता ? कुछ अर्थों में बहुत अलग अनुमानित क्रमपरिवर्तन पैदा करेगा? –

+0

बिल्ट-इन 'हैश' सभ्य और सुंदर कुशल है - परिवार के भीतर इंडेक्स से (लेकिन पर्याप्त अराजक तरीके से) पर निर्भर करता है, यह एक हैश फ़ंक्शन को चालू करने के लिए एक और सभ्य/कुशल तरीका लगता है एक परिवार में यदि गति कोई समस्या नहीं है तो आप मजबूत (क्रिप्टो-गुणवत्ता) हैशिंग का उपयोग कर सकते हैं, मुझे लगता है - यह संभवतः आपको उच्च गुणवत्ता प्रदान करेगा (न तो हैश और न ही यादृच्छिक क्रिप्टो-गुणवत्ता है और इस प्रकार न तो उनका एक्सओआर ;-) है लेकिन गति प्रभाव वास्तव में है बड़ा (परिमाण के आदेश ...)। –

+0

धन्यवाद। असल में, मुझे विश्वास है कि गति मेरे लिए यहां महत्वपूर्ण होगी। एकमात्र "गुणवत्ता" मैं देख रहा हूं कि हैश फ़ंक्शन मेरे मूल प्रश्न में वर्णित प्रक्रिया द्वारा "अलग-अलग" यादृच्छिक क्रमपरिवर्तन उत्पन्न करेंगे (मुझे यकीन नहीं है कि यह कैसे मापें ...)। फिर, आपके महान उत्तर के लिए बहुत बहुत धन्यवाद। –

0

आपको सार्वभौमिक हैशिंग का उपयोग करने पर विचार करना चाहिए। मेरा उत्तर और कोड यहां पाया जा सकता है: https://stackoverflow.com/a/25104050/207661

0

जैसा ऊपर बताया गया है, आप मिन्हैश के लिए सार्वभौमिक हैशिंग का उपयोग कर सकते हैं। उदाहरण के लिए:

import random 



def minhash(): 
    d1 = set(random.randint(0, 2000) for _ in range(1000)) 
    d2 = set(random.randint(0, 2000) for _ in range(1000)) 
    jacc_sim = len(d1.intersection(d2))/len(d1.union(d2)) 
    print("jaccard similarity: {}".format(jacc_sim)) 

    N_HASHES = 200 
    hash_funcs = [] 
    for i in range(N_HASHES): 
     hash_funcs.append(universal_hashing()) 

    m1 = [min([h(e) for e in d1]) for h in hash_funcs] 
    m2 = [min([h(e) for e in d2]) for h in hash_funcs] 
    minhash_sim = sum(int(m1[i] == m2[i]) for i in range(N_HASHES))/N_HASHES 
    print("min-hash similarity: {}".format(minhash_sim)) 



def universal_hashing(): 
    def rand_prime(): 
     while True: 
      p = random.randrange(2 ** 32, 2 ** 34, 2) 
      if all(p % n != 0 for n in range(3, int((p ** 0.5) + 1), 2)): 
       return p 
    m = 2 ** 32 - 1 
    p = rand_prime() 
    a = random.randint(0, p) 
    if a % 2 == 0: 
     a += 1 
    b = random.randint(0, p) 
    def h(x): 
     return ((a * x + b) % p) % m 
    return h 

Reference

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18596735) – Yaron

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