यहाँ MurmurHash3 32 का एक शुद्ध अजगर कार्यान्वयन चला जाता है, यह तार केवल हैश लेकिन आसानी बजाय बाइट सरणियों लेने के लिए अनुकूलित किया जा सकता। यह एल्गोरिदम के Java version से एक बंदरगाह है।
def murmur3_x86_32(data, seed = 0):
c1 = 0xcc9e2d51
c2 = 0x1b873593
length = len(data)
h1 = seed
roundedEnd = (length & 0xfffffffc) # round down to 4 byte block
for i in range(0, roundedEnd, 4):
# little endian load order
k1 = (ord(data[i]) & 0xff) | ((ord(data[i + 1]) & 0xff) << 8) | \
((ord(data[i + 2]) & 0xff) << 16) | (ord(data[i + 3]) << 24)
k1 *= c1
k1 = (k1 << 15) | ((k1 & 0xffffffff) >> 17) # ROTL32(k1,15)
k1 *= c2
h1 ^= k1
h1 = (h1 << 13) | ((h1 & 0xffffffff) >> 19) # ROTL32(h1,13)
h1 = h1 * 5 + 0xe6546b64
# tail
k1 = 0
val = length & 0x03
if val == 3:
k1 = (ord(data[roundedEnd + 2]) & 0xff) << 16
# fallthrough
if val in [2, 3]:
k1 |= (ord(data[roundedEnd + 1]) & 0xff) << 8
# fallthrough
if val in [1, 2, 3]:
k1 |= ord(data[roundedEnd]) & 0xff
k1 *= c1
k1 = (k1 << 15) | ((k1 & 0xffffffff) >> 17) # ROTL32(k1,15)
k1 *= c2
h1 ^= k1
# finalization
h1 ^= length
# fmix(h1)
h1 ^= ((h1 & 0xffffffff) >> 16)
h1 *= 0x85ebca6b
h1 ^= ((h1 & 0xffffffff) >> 13)
h1 *= 0xc2b2ae35
h1 ^= ((h1 & 0xffffffff) >> 16)
return h1 & 0xffffffff
स्रोत
2014-05-30 14:53:22
आप शुद्ध पायथन कार्यान्वयन क्यों चाहते हैं? –
मुझे शुद्ध पायथन कार्यान्वयन की आवश्यकता है क्योंकि मेरे एप्लिकेशन को उन प्लेटफॉर्म पर चलाने की आवश्यकता है जो गैर-पायथन कोड (जैसे Google App Engine) निष्पादित नहीं कर सकते हैं। – greg
यह भी एक है, लेकिन मुझे लगता है कि आपके द्वारा पाया गया mmh3 एक बेहतर देखभाल करता है। https://code.google.com/p/pyfasthash/ –