真实业务算法

本文介绍了一种用于判断航班号相似性的算法,主要针对公司相同或不同的情况下,航班号中数字部分的相似特征进行匹配。包括连续数字的比较、数字位置的差异以及容易混淆的呼号处理。

业务需求

1、公司相同,数字仅有一位不同,且有2个(含)以上相同数字连续且位置一致;

例如:CSN3473和CSN3438   CSN323和CSN325

2、公司相同,相同数字位置不完全一致;

例如:CDG4963和CDG4639

3、公司不同:

航班号是三位数字的后两位数字相同且位置一致;

航班号是四位数字的后三位数字相同且位置一致;

例如: CCA107和CSN307    CSN6555和CSC8555

       CSH9201和CSZ8201    

5、其他未涵盖但发音或外形比较容易混淆或易引起误听误判的呼号

    例如:OMA20144和OMA20044

我的解决办法

 

        ///     判断两个航班号是否相似
        /// </summary>
        /// <param name="calsign1"></param>
        /// <param name="calsign2"></param>
        /// <returns></returns>
        private static bool IsSameFlight(string calsign1, string calsign2)
        {
            int x = 0;//标记字母个数
            int y = 0;//标记数字个数

            //航班号位数不相同不是相似航班
            if (calsign1.Length != calsign2.Length) return false;

            //航班号位数相同
            for (int i = 0; i < calsign1.Length; i++)
            {
                
                if (calsign1[i] == calsign2[i] && (calsign1[i] >= 'A' && calsign1[i] <= 'Z'))
                {
                    x++;
                    continue;
                }

                #region 公司相同时,数字为3位的情况
                else if (x >= 3 && (calsign1.Length - i == 3))
                {
                    for (int j = i; j < calsign1.Length; j++)
                    {
                        if (calsign1[j] != calsign2[j] && y < 2)
                        {
                            if (!(calsign1[i] >= 'A' && calsign1[i] <= 'Z'))
                            {
                                int count = 0;
                                for (int k = i; k < calsign1.Length; k++)
                                    for (int l = i; l < calsign1.Length; l++)
                                        if (calsign1[k] == calsign2[l])
                                        {
                                            count++;
                                            break;
                                        }
                                if (count == 3) return true;
                            }
                            return false;
                        }
                        else if (calsign1[j] == calsign2[j] && y < 2)
                        {
                            y++;
                            continue;
                        }
                        else return true;
                    }


                } 
                #endregion

                #region 公司相同时,数字为4位的情况
                else if (x >= 3 && (calsign1.Length - i == 4))
                {
                    for (int j = i; j < calsign1.Length; j++)
                    {
                        if (calsign1[j] != calsign2[j] && y < 2)
                        {
                            if (!(calsign1[i] >= 'A' && calsign1[i] <= 'Z'))
                            {
                                int count = 0;
                                for (int k = i; k < calsign1.Length; k++)
                                    for (int l = i; l < calsign1.Length; l++)
                                        if (calsign1[k] == calsign2[l])
                                        {
                                            count++;
                                            break;
                                        }
                                if (count == 4) return true;
                            }
                            return false;
                        }
                        else if (calsign1[j] == calsign2[j] && y < 2)
                        {
                            y++;
                            continue;
                        }
                        else if (calsign1[j] != calsign2[j] && y == 2 && (calsign1[j] == calsign2[j + 1] || calsign1[j + 1] == calsign2[j] || calsign1[j + 1] == calsign2[j + 1]))
                            return true;
                        else return false;
                    }
                } 
                #endregion

                #region 公司不同时
                else if (x < 3)
                {
                    if (calsign1.Length == 6)
                        for (int j = calsign1.Length - 1; j > 2; j--)
                        {
                            if (calsign1[j] == calsign2[j])
                            {
                                y++;
                                continue;
                            }
                            else if (y < 2) return false;
                            else if (y >= 2) return true;
                        }
                    else if (calsign1.Length == 7)
                        for (int j = calsign1.Length - 1; j > 2; j--)
                        {
                            if (calsign1[j] == calsign2[j])
                            {
                                y++;
                                continue;
                            }
                            else if (y < 3) return false;
                            else if (y >= 3) return true;
                        }
                } 
                #endregion

            }

            //其他情况暂时为不相似
            return false;
        }

项目是针对具体应用的,所以看从业务逻辑到实现的过程比代码本身要重要。  其实不外乎选择、循环等结构。

<think>嗯,用户这次的问题是关于证券企业业务数据脱敏的算法选择。从对话历史看,用户之前询问过MySQL和Oracle的对比,现在转向了数据安全领域,可能是证券企业的IT架构师或数据安全负责人。 用户引用了四份关于数据脱敏的材料,其中提到静态脱敏、动态脱敏、AI优化策略等关键概念。证券行业对数据脱敏有特殊要求:既要保证交易数据的真实性(如股价、成交量),又要隐藏客户敏感信息(身份证号、账户余额)。这需要平衡数据可用性和安全性。 证券行业的脱敏难点在于:1) 金融数据关联性强(如自营盘持仓和客户持仓需区别处理);2) 实时性要求高(动态脱敏不能影响交易系统性能);3) 需满足《证券期货业数据分类分级指引》等监管要求。 参考材料中提到的脱敏方法很有价值:[^3]提到的静态/动态脱敏分类适用于证券场景——静态脱敏用于开发测试环境使用生产数据,动态脱敏用于客服人员查看客户信息时实时隐藏敏感字段。[^4]提到的AI策略优化也很关键,证券企业常有专业术语(如“质押式回购”)容易被误脱敏,需要持续优化。 具体到算法选择: - 客户姓名适合用掩码(张**)或泛化(张先生) - 身份证号需保留前6位(地区码)和末4位(验证码),中间用*填充 - 证券账号可采用格式保留加密(FPE),保持数字位数不变 - 持仓金额适合区间化(如“100万-500万”) - 委托记录需注意关联性(同一客户的买卖记录脱敏后仍能关联分析) 特别要注意[^2]强调的“保持统计特性”——证券企业的风控模型依赖数据分布,脱敏后的交易金额方差、峰值等统计特征应与原始数据一致。这可能需要采用K-匿名或差分隐私等高级算法。 最后生成的问题覆盖了证券行业特有的痛点:算法选择标准(监管合规性优先)、动态脱敏性能(不能影响交易响应时间)、AI误判修正(如“科创板”被误识别为敏感词)等。这些问题都指向证券业务的实际操作难点。</think>以下是针对证券企业业务数据脱敏的常用算法及选型建议,结合行业特性和引用内容分析: --- ### 一、证券行业脱敏的核心需求 1. **合规性要求** - 需满足《证券期货业数据分类分级指引》《个人信息保护法》等法规 - 重点保护客户身份、账户、持仓、交易记录等敏感数据[^3] 2. **业务特殊性** - 需保持数据关联性(如客户-账户-交易关系) - 保留统计特征(如交易金额分布、频率)用于风控分析[^2] --- ### 二、证券企业常用脱敏算法 #### 1. **基础算法** | **算法类型** | **适用场景** | **证券行业案例** | |--------------------|-----------------------------|--------------------------------------| | **掩码(Masking)** | 身份证/银行卡号 | `510***********1234` 保留首尾四位[^1] | | **泛化(Generalization)** | 交易金额/日期 | 精确金额 → 区间(如`10万-50万`) | | **替换(Substitution)** | 客户姓名/地址 | 张三 → 李四(保持姓氏分布)[^2] | | **扰乱(Scrambling)** | 证券账号/合同编号 | `A3829B` → `B9283A`(保持格式) | #### 2. **高级算法** | **算法** | **技术原理** | **证券应用价值** | |-------------------------|-----------------------------|--------------------------------------| | **K-匿名(K-Anonymity)** | 分组隐匿(每组≥k条相似数据) | 保护客户持仓组合的统计发布[^3] | | **差分隐私(Differential Privacy)** | 添加可控噪声 | 防止通过交易数据反推客户身份[^4] | | **格式保留加密(FPE)** | 加密后保持原数据格式 | 证券账号脱敏后仍可参与系统测试[^1] | > 💡 **关键需求适配**: > - **动态脱敏**:实时遮蔽敏感字段(如客服系统仅显示客户姓名首字)[^3] > - **静态脱敏**:批量处理测试数据时保持表关联(如客户表与交易表的外键一致性)[^2] --- ### 三、算法选型决策框架 ```mermaid graph TD A[数据类型] --> B{是否需保持关联性?} B -->|是| C[选择K-匿名/格式保留加密] B -->|否| D{是否需保留统计特征?} D -->|是| E[差分隐私+泛化] D -->|否| F[基础掩码/替换] ``` #### 典型场景方案: 1. **客户信息脱敏** - 姓名:泛化(张*阳) + 替换(姓氏库轮换) - 身份证:掩码(510********123X) + FPE加密[^1] 2. **交易数据脱敏** - 金额:泛化为区间(保留金额分布) - 时间:偏移±3天(保持时序关系)[^2] 3. **投研数据发布** - 采用差分隐私添加噪声,确保无法逆向推导个体持仓[^4] --- ### 四、实施建议 1. **策略分层配置** ```python # 示例:证券核心系统脱敏策略配置 strategies = { "客户表": { "name": {"algorithm": "partial_mask", "retain_head": 1}, # 张*三 "id_card": {"algorithm": "fpe", "key": "SEC_KEY_2024"} }, "交易表": { "amount": {"algorithm": "binning", "bins": [0, 1e5, 5e5]} # 分箱泛化 } } ``` 2. **AI优化闭环**(引用[^4]) - 通过误判标注修正模型:如“科创板”等专业术语加入白名单 - 脱敏策略动态推荐:根据API调用历史自动匹配最优算法组合 --- ### 五、特别注意事项 1. **关联性保障** - 脱敏后需验证:`客户ID`在账户表、交易表中的一致性 2. **性能要求** - 动态脱敏延迟需<50ms(避免影响交易系统)[^3] 3. **审计追踪** - 记录脱敏操作日志,满足合规审计要求 > **选型总结**:证券企业宜采用 **格式保留加密+FPE**(账号类)、**K-匿名+泛化**(持仓统计)、**差分隐私**(投研数据发布)的组合策略,并通过AI持续优化误判率[^4]。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值