Loading

murmurhash64 哈希算法

def build_tars_req_packet(servant_name, func_name, req):
    req_buffer = dumps(JceDict({
        7: dumps(JceDict({
            0: {
                'req': dumps(req)
            }
        }))
    }))
    req_packet_hex = '10032c3c4003'  # protocol version
    req_packet_hex += '56' + format(len(servant_name), '02x') + servant_name.encode().hex()
    req_packet_hex += '66' + format(len(func_name), '02x') + func_name.encode().hex()
    req_packet_hex += req_buffer.hex()
    req_packet_hex += '8c980ca80c'  # context data
    logger.debug("req_packet: %s", loads(bytes.fromhex(req_packet_hex)))
    r_head = format((len(req_packet_hex) >> 1) + 4, '08x')
    return r_head + req_packet_hex

def generate_lcg_hex(seed: int, v5: int) -> str:
    result = []
    loop_count = v5 // 4 + 1

    for _ in range(loop_count):
        v20 = (214013 * seed + 2531011) >> 16
        seed = v20 & 0x7FFF
        result.append(f"{seed:x}")

    return "".join(result)

def hash_murmurhash64(data_str: str, seed: int) -> int:
    MASK64 = 0xFFFFFFFFFFFFFFFF
    M = 0xC6A4A7935BD1E995
    R = 47

    CONST2 = 0x2733A5BFD097A4DE
    CONST3 = 0xD8CC5A402F685B21
    CONST4 = 0x2F685B21

    data_bytes = data_str.encode()
    data_len = len(data_bytes)

    v3 = (M * data_len) & MASK64
    h = ((~v3 & CONST2) | (v3 & CONST3)) ^ ((~seed & CONST2) | (seed & CONST4))

    block_size = data_len >> 3
    mv = memoryview(data_bytes)
    for i in range(block_size):
        k = int.from_bytes(mv[i * 8:(i + 1) * 8], 'little')

        k = (k * M) & MASK64
        k ^= k >> R
        k = (k * M) & MASK64

        h ^= k
        h = (h * M) & MASK64

    remaining = data_len & 7
    if remaining > 0:
        tail_index = block_size * 8
        tail = 0
        for i in range(remaining):
            tail |= mv[tail_index + i] << (8 * i)
        h ^= tail
        h = (h * M) & MASK64

    h ^= h >> R
    h = (h * M) & MASK64
    h ^= h >> R

    return h
posted @ 2026-02-27 16:48  xtyuns  阅读(6)  评论(0)    收藏  举报