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