返回题库

FIX 校验和验证器

Fix Checksum Validator

专题
Systems & Architecture / 系统与架构
难度
L1
来源
MyntBit

题目详情

FIX 协议是金融市场实时信息交换的电子通信标准。为保证数据完整性,每条 FIX 消息末尾包含校验和字段(Tag 10)。低延迟交易系统必须在解析消息正文前快速高效地校验此校验和,丢弃损坏数据。

任务:实现 validateChecksum 函数,接收 FIX 消息字符串,按协议规则计算校验和并与 Tag 10 值比对,返回校验结果。

英文原题

The Financial Information eXchange (FIX) protocol is a standard electronic communications protocol used to exchange real-time information related to financial markets. To ensure data integrity, every FIX message ends with a checksum field (Tag 10). Low-latency trading systems must quickly and efficiently validate this checksum before parsing the rest of the message to discard corrupted data.
Task
Implement a class FIXValidator with a method isValid that takes a FIX message as a string and retur

解析

问题分析

FIX(金融信息交换)协议是电子交易的行业标准。消息构建需要按 FIX 标签-值格式编码,校验和是对消息字节求和模 256。会话层管理序列号、心跳和重传。

解法

class FIXMessage {
    std::string body_;
public:
    FIXMessage& add(int tag, const std::string& val) { body_ += std::to_string(tag) + "=" + val + "\x01"; return *this; }
    std::string build() const {
        std::string msg = "8=FIX.4.2\x01" + body_;
        int checksum = 0; for (char c : msg) checksum += (unsigned char)c;
        return msg + "10=" + std::to_string(checksum % 256) + "\x01";
    }
};
// 使用: FIXMessage().add(55,"AAPL").add(54,1).add(38,"100").add(44,"150.25").build()

验证

构建订单消息: 8=FIX.4.2|55=AAPL|54=1|38=100|44=150.25|10=XXX
checksum = (各字节之和) % 256,确保与接收端计算一致 ✓

复杂度与边界

  • 时间复杂度:build O(N),N 为消息长度
  • 边界条件:(1) 字段值含分隔符需转义 (2) checksum 三位数不足补零 (3) 序列号跳变触发重传

英文解析

Analysis

FIX (Financial Information Exchange) protocol is the industry standard for electronic trading. Message validation requires computing a checksum over all message bytes (sum modulo 256) and comparing it against the transmitted checksum tag (tag 10). Discrepancies indicate corruption or tampering.

Solution

class FIXChecksumValidator {
public:
    static bool validate(const std::string& msg) {
        // Find checksum tag (10=xxx<SOH>)
        auto pos = msg.rfind("10=");
        if (pos == std::string::npos) return false;
        // Compute checksum over all bytes before the checksum tag
        int computed = 0;
        for (size_t i = 0; i < pos; ++i) computed += (unsigned char)msg[i];
        computed %= 256;
        // Extract transmitted checksum value
        int transmitted = std::stoi(msg.substr(pos + 3, 3));
        return computed == transmitted;
    }
};

Verification

Build order message: 8=FIX.4.2|55=AAPL|54=1|38=100|44=150.25|10=XXX. checksum = (sum of all bytes) % 256, must match receiver-side calculation.

Complexity & Edge Cases

  • Time complexity: validate O(N), N = message length
  • Edge cases: (1) Field values containing separator must be escaped (2) checksum padded to 3 digits with leading zeros (3) Sequence number gap triggers retransmission

Key Considerations

  1. Checksum scope: FIX checksum (tag 10) covers bytes from BeginString (8=) through final SOH before checksum field — inclusive of all SOH delimiters
  2. Modular arithmetic: FIX checksum = sum of all bytes mod 256; result must be formatted as three-digit string (001-256) with leading zeros
  3. Encoding consistency: Checksum computation must use same byte encoding as transmission (typically ASCII); UTF-8 multi-byte characters produce incorrect checksums
  4. Performance: Checksum validation on every inbound message adds per-message overhead; pre-validate before parsing to reject corrupted messages early