def murmur2(key):
<EOL>if isinstance(key, bytearray) or (six.PY3 and isinstance(key, bytes)):<EOL><INDENT>data = key<EOL><DEDENT>else:<EOL><INDENT>data = bytearray(str(key).encode())<EOL><DEDENT>length = len(data)<EOL>seed = <NUM_LIT><EOL>m = <NUM_LIT><EOL>r = <NUM_LIT><EOL>h = seed ^ length<EOL>length4 = length // <NUM_LIT:4><EOL>for i in range(length4):<EOL><INDENT>i4 = i * <NUM_LIT:4><EOL>k = ((data[i4 + <NUM_LIT:0>] & <NUM_LIT>) +<EOL>((data[i4 + <NUM_LIT:1>] & <NUM_LIT>) << <NUM_LIT:8>) +<EOL>((data[i4 + <NUM_LIT:2>] & <NUM_LIT>) << <NUM_LIT:16>) +<EOL>((data[i4 + <NUM_LIT:3>] & <NUM_LIT>) << <NUM_LIT>))<EOL>k &= <NUM_LIT><EOL>k *= m<EOL>k &= <NUM_LIT><EOL>k ^= (k % <NUM_LIT>) >> r  <EOL>k &= <NUM_LIT><EOL>k *= m<EOL>k &= <NUM_LIT><EOL>h *= m<EOL>h &= <NUM_LIT><EOL>h ^= k<EOL>h &= <NUM_LIT><EOL><DEDENT>extra_bytes = length % <NUM_LIT:4><EOL>if extra_bytes >= <NUM_LIT:3>:<EOL><INDENT>h ^= (data[(length & ~<NUM_LIT:3>) + <NUM_LIT:2>] & <NUM_LIT>) << <NUM_LIT:16><EOL>h &= <NUM_LIT><EOL><DEDENT>if extra_bytes >= <NUM_LIT:2>:<EOL><INDENT>h ^= (data[(length & ~<NUM_LIT:3>) + <NUM_LIT:1>] & <NUM_LIT>) << <NUM_LIT:8><EOL>h &= <NUM_LIT><EOL><DEDENT>if extra_bytes >= <NUM_LIT:1>:<EOL><INDENT>h ^= (data[length & ~<NUM_LIT:3>] & <NUM_LIT>)<EOL>h &= <NUM_LIT><EOL>h *= m<EOL>h &= <NUM_LIT><EOL><DEDENT>h ^= (h % <NUM_LIT>) >> <NUM_LIT>  <EOL>h &= <NUM_LIT><EOL>h *= m<EOL>h &= <NUM_LIT><EOL>h ^= (h % <NUM_LIT>) >> <NUM_LIT:15>  <EOL>h &= <NUM_LIT><EOL>return h<EOL>
Pure-python Murmur2 implementation.

    Based on java client, see org.apache.kafka.common.utils.Utils.murmur2

    Args:
        key: if not a bytes type, encoded using default encoding

    Returns: MurmurHash2 of key bytearray