""" 机器码规范化:对 raw_machine_info 做统一解析与排序,使同一台机器在不同枚举顺序下得到相同 MD5。 """ import hashlib from typing import List def normalize_raw_machine_info(raw: str) -> str: """ 规范化 raw_machine_info。 客户端格式:DISK=serial1;serial2;MAC=mac1;mac2(DISK 与 MAC 段内均为分号分隔)。 对两段内分号分隔的项分别排序后重组,使同一组硬件在不同顺序下得到相同字符串。 """ raw = (raw or "").strip() if not raw: return "" disk_part: List[str] = [] mac_part: List[str] = [] idx_mac = raw.find(";MAC=") idx_disk = raw.find("DISK=") if idx_disk >= 0 and idx_mac > idx_disk: disk_str = raw[idx_disk + 5 : idx_mac].strip() # 5 = len("DISK=") disk_part = [s.strip() for s in disk_str.split(";") if s.strip()] if idx_mac >= 0: mac_str = raw[idx_mac + 5 :].strip() # 5 = len(";MAC=") mac_part = [s.strip() for s in mac_str.split(";") if s.strip()] elif raw.upper().startswith("MAC="): mac_str = raw[4:].strip() mac_part = [s.strip() for s in mac_str.split(";") if s.strip()] if not disk_part and not mac_part: return raw disk_part.sort() mac_part.sort() parts = [] if disk_part: parts.append("DISK=" + ";".join(disk_part)) if mac_part: parts.append("MAC=" + ";".join(mac_part)) return ";".join(parts) def raw_machine_info_to_machine_code(raw: str) -> str: """从 raw_machine_info 得到 machine_code(规范化后 MD5,与登录/心跳等逻辑一致)""" raw = (raw or "").strip() if not raw: return "" canonical = normalize_raw_machine_info(raw) return hashlib.md5(canonical.encode()).hexdigest()