2010-07-19 17 views
12

क्या Jenkins hash एल्गोरिदम (ओं) का मूल पायथन कार्यान्वयन मौजूद है?जेनकिंस हैश के पायथन कार्यान्वयन?

मुझे एक हैश एल्गोरिदम की आवश्यकता है जो एक मनमानी स्ट्रिंग लेता है और इसे 32-बिट पूर्णांक में बदल देता है। किसी दिए गए स्ट्रिंग के लिए, इसे प्लेटफॉर्म पर एक ही पूर्णांक को वापस करने की गारंटी देनी होगी।

मैंने ईएलएफ हैश एल्गोरिदम देखा है, जिसमें से मुझे पाइथन कार्यान्वयन मिला है। क्या यह उपर्युक्त मानदंडों के अनुसार एक उपयुक्त प्रतिस्थापन हो सकता है? (http://www.partow.net/programming/hashfunctions/#ELFHashFunction)

उत्तर

0

पीपीपी पर पहले से ही "jenkins" package है। लेकिन यह "मूल" नहीं है के रूप में कोर कार्यान्वयन सी

+0

हाँ, मैं यह मिल गया के रूप में आप एक ही हैश देना चाहिए है, लेकिन जब मैं इसे विंडोज़ पर स्थापित करने का प्रयास करता हूं तो मुझे कुछ गायब .bat-file के बारे में त्रुटि संदेश मिलते हैं। मैं कम से कम पूर्व शर्त के साथ एक समाधान की तलाश में हूं। – DavidR

+0

जेनकींस 1.0.2 पीईपीआई पैकेज "ओएसईआरआर: /usr/lib/python2.6/dist-packages/lookup3.so के साथ लिनक्स पर भी निर्माण में विफल रहता है: साझा ऑब्जेक्ट फ़ाइल नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं है" –

3

तुम बस एक md5sum

>>> from hashlib import md5 
>>> from struct import unpack 
>>> unpack("<IIII",md5("thestring").digest())[0] 
1515985217 
+2

आम तौर पर MD5 है गति कारणों से बचें जब तक कि आपको वास्तव में * क्रिप्टोग्राफ़िक हैश की आवश्यकता न हो। लेकिन निश्चित रूप से एमडी 5 के सी पुस्तकालय कार्यान्वयन से उपरोक्त एल्गोरिदम के शुद्ध पायथन कार्यान्वयन को एक बहुत ही मार्जिन से हराया जाएगा! –

2

अपने दम पर यह लागू करने समाप्त के पहले 32 बिट का उपयोग कर सकते है। मूल कॉपीराइट नोटिस के अनुसार जारी (नीचे देखें)। अपने जोखिम पर उपयोग करें और मज़ा :-)

'''Implements a straight Jenkins lookup hash - http://burtleburtle.net/bob/hash/doobs.html 

Usage: 
    from jhash import jhash 
    print jhash('My hovercraft is full of eels') 

Returns: unsigned 32 bit integer value 

Prereqs: None 

Tested with Python 2.6. 
Version 1.00 - [email protected] - 23.08.2010 

Partly based on the Perl module Digest::JHash 
http://search.cpan.org/~shlomif/Digest-JHash-0.06/lib/Digest/JHash.pm 

Original copyright notice: 
    By Bob Jenkins, 1996. [email protected] You may use this 
    code any way you wish, private, educational, or commercial. It's free. 

    See http://burtleburtle.net/bob/hash/evahash.html 
    Use for hash table lookup, or anything where one collision in 2^^32 is 
    acceptable. Do NOT use for cryptographic purposes. 
''' 

def mix(a, b, c): 
    '''mix() -- mix 3 32-bit values reversibly. 
For every delta with one or two bits set, and the deltas of all three 
    high bits or all three low bits, whether the original value of a,b,c 
    is almost all zero or is uniformly distributed, 
* If mix() is run forward or backward, at least 32 bits in a,b,c 
    have at least 1/4 probability of changing. 
* If mix() is run forward, every bit of c will change between 1/3 and 
    2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)''' 
    # Need to constrain U32 to only 32 bits using the & 0xffffffff 
    # since Python has no native notion of integers limited to 32 bit 
    # http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex 
    a &= 0xffffffff; b &= 0xffffffff; c &= 0xffffffff 
    a -= b; a -= c; a ^= (c>>13); a &= 0xffffffff 
    b -= c; b -= a; b ^= (a<<8); b &= 0xffffffff 
    c -= a; c -= b; c ^= (b>>13); c &= 0xffffffff 
    a -= b; a -= c; a ^= (c>>12); a &= 0xffffffff 
    b -= c; b -= a; b ^= (a<<16); b &= 0xffffffff 
    c -= a; c -= b; c ^= (b>>5); c &= 0xffffffff 
    a -= b; a -= c; a ^= (c>>3); a &= 0xffffffff 
    b -= c; b -= a; b ^= (a<<10); b &= 0xffffffff 
    c -= a; c -= b; c ^= (b>>15); c &= 0xffffffff 
    return a, b, c 

def jhash(data, initval = 0): 
    '''hash() -- hash a variable-length key into a 32-bit value 
    data : the key (the unaligned variable-length array of bytes) 
    initval : can be any 4-byte value, defaults to 0 
Returns a 32-bit value. Every bit of the key affects every bit of 
the return value. Every 1-bit and 2-bit delta achieves avalanche.''' 
    length = lenpos = len(data) 

    # empty string returns 0 
    if length == 0: 
     return 0 

    # Set up the internal state 
    a = b = 0x9e3779b9 # the golden ratio; an arbitrary value 
    c = initval  # the previous hash value 
    p = 0    # string offset 

    # ------------------------- handle most of the key in 12 byte chunks 
    while lenpos >= 12: 
     a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)) 
     b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16) + (ord(data[p+7])<<24)) 
     c += (ord(data[p+8]) + (ord(data[p+9])<<8) + (ord(data[p+10])<<16) + (ord(data[p+11])<<24)) 
     a, b, c = mix(a, b, c) 
     p += 12 
     lenpos -= 12 

    # ------------------------- handle the last 11 bytes 
    c += length 
    if lenpos >= 11: c += ord(data[p+10])<<24 
    if lenpos >= 10: c += ord(data[p+9])<<16 
    if lenpos >= 9: c += ord(data[p+8])<<8 
    # the first byte of c is reserved for the length 
    if lenpos >= 8: b += ord(data[p+7])<<24 
    if lenpos >= 7: b += ord(data[p+6])<<16 
    if lenpos >= 6: b += ord(data[p+5])<<8 
    if lenpos >= 5: b += ord(data[p+4]) 
    if lenpos >= 4: a += ord(data[p+3])<<24 
    if lenpos >= 3: a += ord(data[p+2])<<16 
    if lenpos >= 2: a += ord(data[p+1])<<8 
    if lenpos >= 1: a += ord(data[p+0]) 
    a, b, c = mix(a, b, c) 

    # ------------------------- report the result 
    return c 

if __name__ == "__main__": 
    hashstr = 'My hovercraft is full of eels' 
    myhash = jhash(hashstr) 
    print 'jhash("%s"): %d' % (hashstr, myhash) 
10

यह देशी अजगर-कोड मूल lookup3.c

# Need to constrain U32 to only 32 bits using the & 0xffffffff 
# since Python has no native notion of integers limited to 32 bit 
# http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex 

'''Original copyright notice: 
    By Bob Jenkins, 1996. [email protected] You may use this 
    code any way you wish, private, educational, or commercial. Its free. 
''' 

def rot(x,k): 
    return (((x)<<(k)) | ((x)>>(32-(k)))) 

def mix(a, b, c): 
    a &= 0xffffffff; b &= 0xffffffff; c &= 0xffffffff 
    a -= c; a &= 0xffffffff; a ^= rot(c,4); a &= 0xffffffff; c += b; c &= 0xffffffff 
    b -= a; b &= 0xffffffff; b ^= rot(a,6); b &= 0xffffffff; a += c; a &= 0xffffffff 
    c -= b; c &= 0xffffffff; c ^= rot(b,8); c &= 0xffffffff; b += a; b &= 0xffffffff 
    a -= c; a &= 0xffffffff; a ^= rot(c,16); a &= 0xffffffff; c += b; c &= 0xffffffff 
    b -= a; b &= 0xffffffff; b ^= rot(a,19); b &= 0xffffffff; a += c; a &= 0xffffffff 
    c -= b; c &= 0xffffffff; c ^= rot(b,4); c &= 0xffffffff; b += a; b &= 0xffffffff 
    return a, b, c 

def final(a, b, c): 
    a &= 0xffffffff; b &= 0xffffffff; c &= 0xffffffff 
    c ^= b; c &= 0xffffffff; c -= rot(b,14); c &= 0xffffffff 
    a ^= c; a &= 0xffffffff; a -= rot(c,11); a &= 0xffffffff 
    b ^= a; b &= 0xffffffff; b -= rot(a,25); b &= 0xffffffff 
    c ^= b; c &= 0xffffffff; c -= rot(b,16); c &= 0xffffffff 
    a ^= c; a &= 0xffffffff; a -= rot(c,4); a &= 0xffffffff 
    b ^= a; b &= 0xffffffff; b -= rot(a,14); b &= 0xffffffff 
    c ^= b; c &= 0xffffffff; c -= rot(b,24); c &= 0xffffffff 
    return a, b, c 

def hashlittle2(data, initval = 0, initval2 = 0): 
    length = lenpos = len(data) 

    a = b = c = (0xdeadbeef + (length) + initval) 

    c += initval2; c &= 0xffffffff 

    p = 0 # string offset 
    while lenpos > 12: 
     a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); a &= 0xffffffff 
     b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16) + (ord(data[p+7])<<24)); b &= 0xffffffff 
     c += (ord(data[p+8]) + (ord(data[p+9])<<8) + (ord(data[p+10])<<16) + (ord(data[p+11])<<24)); c &= 0xffffffff 
     a, b, c = mix(a, b, c) 
     p += 12 
     lenpos -= 12 

    if lenpos == 12: c += (ord(data[p+8]) + (ord(data[p+9])<<8) + (ord(data[p+10])<<16) + (ord(data[p+11])<<24)); b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16) + (ord(data[p+7])<<24)); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); 
    if lenpos == 11: c += (ord(data[p+8]) + (ord(data[p+9])<<8) + (ord(data[p+10])<<16)); b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16) + (ord(data[p+7])<<24)); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); 
    if lenpos == 10: c += (ord(data[p+8]) + (ord(data[p+9])<<8)); b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16) + (ord(data[p+7])<<24)); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); 
    if lenpos == 9: c += (ord(data[p+8])); b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16) + (ord(data[p+7])<<24)); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); 
    if lenpos == 8: b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16) + (ord(data[p+7])<<24)); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); 
    if lenpos == 7: b += (ord(data[p+4]) + (ord(data[p+5])<<8) + (ord(data[p+6])<<16)); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); 
    if lenpos == 6: b += ((ord(data[p+5])<<8) + ord(data[p+4])); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)) 
    if lenpos == 5: b += (ord(data[p+4])); a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)); 
    if lenpos == 4: a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16) + (ord(data[p+3])<<24)) 
    if lenpos == 3: a += (ord(data[p+0]) + (ord(data[p+1])<<8) + (ord(data[p+2])<<16)) 
    if lenpos == 2: a += (ord(data[p+0]) + (ord(data[p+1])<<8)) 
    if lenpos == 1: a += ord(data[p+0]) 
    a &= 0xffffffff; b &= 0xffffffff; c &= 0xffffffff 
    if lenpos == 0: return c, b 

    a, b, c = final(a, b, c) 

    return c, b 

def hashlittle(data, initval=0): 
    c, b = hashlittle2(data, initval, 0) 
    return c 

if __name__ == "__main__": 
    import sys 
    hashstr = 'Four score and seven years ago' 
    hash, hash2 = hashlittle2(hashstr, 0xdeadbeef, 0xdeadbeef) 
    print '"%s": %x %x' % (hashstr, hash, hash2) 

    hash = hashlittle(hashstr, 0) 
    print '"%s": %x' % (hashstr, hash) 
+0

कमाल !, पूरी तरह से काम करता है, मैंने उसी हैश के अपने स्थानीय सी कार्यान्वयन के खिलाफ परीक्षण किया, बहुत बहुत धन्यवाद !, आपने मुझे काम का एक टन बचाया :) –

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