尘土与星辰 -1992|第305章|哈希与纸页|中文
校验脚本跑完第一遍,耗时四十二分钟。 屏幕上的进度条停在91%。林尘盯着终端输出的日志,呼吸很轻。迁移日志的原始文件是十六进制的压缩包,解压后提取出`SHA-256`校验串。他写了一个简单的比对函数,将压缩包内的哈希值与省二院信息科三年前备份的公开指纹进行逐行
第305章 哈希与纸页
校验脚本跑完第一遍,耗时四十二分钟。
屏幕上的进度条停在91%。林尘盯着终端输出的日志,呼吸很轻。迁移日志的原始文件是十六进制的压缩包,解压后提取出SHA-256校验串。他写了一个简单的比对函数,将压缩包内的哈希值与省二院信息科三年前备份的公开指纹进行逐行匹配。
匹配结果:98.7%一致。
剩下的1.3%,对应的是那批十四千条时间戳完全重合的记录。林尘没有意外。他早就料到,外包团队当年做全量覆盖时,为了赶进度,很可能跳过了部分非核心字段的校验,直接重写了时间戳和主键。在技术层面,这叫“脏迁移”;在审计层面,这叫“数据完整性瑕疵”。
他活动了一下左脚。麻木感已经退到脚踝以上,取而代之的是肌肉纤维持续收缩的酸胀。布洛芬的药效在凌晨三点左右达到峰值,现在正在缓慢消退。他拉开抽屉,摸出那瓶药,看了一眼说明书上的“24小时内不超过4次”,又把瓶盖拧了回去。不能依赖止痛药掩盖神经信号。他需要保持清醒,知道痛在哪里,才能避开会引发痉挛的姿势。
他把椅子往后挪了半寸,让左脚悬空,脚后跟轻轻抵在机箱散热孔的边缘。冷风灌进来,刺痛感稍微钝化了一些。他新建了一个文本文件,命名为AUDIT_TRAIL_MIGRATION_2019Q3.md。
不修饰,不掩盖。他把哈希比对的原始输出、时间戳碰撞的抽样截图、以及外包团队当年的迁移日志摘要,全部贴了进去。在结论栏,他敲下:历史数据迁移存在覆盖操作,导致1.3%记录时间轴失真。已做隔离标记,不影响核心临床指标回溯。建议审计时结合纸质归档目录进行交叉验证。
合规不是完美,是透明。这句话他在错题本上写过三次。
早上七点二十,机房的玻璃门被推开。苏曼带着一身室外的寒气走进来,手里拎着两个牛皮纸档案袋,肩上还挎着相机包。她把档案袋放在林尘旁边的空桌上,发出沉闷的“啪”声。
“信息科的老王只肯给这些。”苏曼拉开椅子坐下,声音有些沙哑,“2016到2018年的纸质病历归档目录,按科室和月份装订。2019年之后的全部电子化了,纸质库没留底。我拍了高清照片,按时间戳排好了。”
林尘点了点头,没说话。他接过档案袋,打开。里面是厚厚一叠打印纸,边缘已经泛黄,带着旧纸张特有的霉味和灰尘。他抽出第一份,是2016年3月内分泌科的复诊记录。纸页上的字迹是圆珠笔写的,有些已经洇开。
“对照开始。”他说。
接下来的三个小时,机房里只有键盘敲击声和纸张翻动的沙沙声。林尘将照片导入本地,写了一个简单的OCR预处理脚本,提取纸质目录上的患者编号、就诊日期和主诊断。然后与数据库里的清洗结果进行笛卡尔积匹配。
匹配率:89.4%。
剩下的10.6%,主要集中在2017年下半年和2019年迁移期。林尘逐条核对。有些是纸质目录漏登,有些是电子系统录入错误,还有些,纯粹是当年医生手写潦草,信息科录入时看错了行。他遇到一例“主诉缺失但检验指标齐全”的记录,纸质目录上只盖了个“已归档”的蓝章,电子系统里却是一串乱码。他没有强行填补,而是将乱码的原始字节快照和蓝章照片并列截图,打上ARCHIVE_MISMATCH标签。
“这批怎么处理?”苏曼指着屏幕上一组标红的记录,“主诉和检验指标对不上。纸质目录写的是‘高血压随访’,电子系统里却是‘糖尿病初筛’。时间戳也是碰撞的那批。”
林尘盯着那行字,手指在桌面上轻轻敲了两下。
“保留原始快照。”他说,“不强行修正。在报告里单列一个‘数据歧义样本集’,附上纸质目录照片和电子系统截图。让伦理委员会自己判断。”
苏曼看了他一眼。“他们会打回重做。”
“打回是他们的流程。”林尘声音很平,“我们交的是真实世界数据,不是标准答案。歧义本身也是数据的一部分。”
苏曼没再反驳。她拿起笔,在记录板上划掉一行,继续整理补充材料。
上午十一点,手机在桌面上震动。老赵的微信。
“省二院的伦理初审过了。卫健委那边催进度。你们的报告,明天下午五点前必须进系统。别拖。”
林尘盯着屏幕,拇指悬在键盘上。明天下午五点。比原计划提前了十二个小时。老赵的催促背后,是竞品已经卡位,窗口期正在收窄。他回复:“收到。报告初稿今晚八点提交内部复核。脱敏流水线已跑通,异常队列已隔离。请同步确认卫健委系统的上传接口版本。”
老赵没回。
林尘放下手机,把注意力拉回屏幕。时间压缩了。他必须在今晚八点前,完成最后一轮映射校验,生成PDF报告,并打包所有原始日志和交叉验证路径。
他调出DataAnonymizerV1的配置文件,将MIGRATION_ARTIFACT和PARSE_ERROR两个标签的隔离策略从“仅记录”改为“独立归档”。这意味着报告体积会增加,但审计轨迹会更完整。他敲下回车,重新编译。
编译进度条缓慢爬升。林尘的左脚开始不受控制地抽搐。他咬住后槽牙,右手按住膝盖,把身体的重心全部移到右腿和椅背上。冷汗从额角渗出来,滴在键盘边缘。他没擦。呼吸刻意放缓,把痛感拆解成可忍受的节拍。
“你的脸色不对。”苏曼停下笔,转头看他。
“药效过了。”林尘声音很轻,“没事。流水线在跑,不占用算力。”
苏曼站起身,走到饮水机旁,接了一杯温水,放在他手边。“喝完。然后去躺椅上闭眼二十分钟。报告生成不需要你盯着。”
林尘端起水杯,慢慢喝完。水温顺着食道下去,胃里稍微暖了一些。他靠在椅背上,闭上眼睛。机房的风扇声、硬盘的读写声、苏曼整理纸张的摩擦声,在黑暗中被放大。他没有睡着,只是在脑子里过一遍报告的目录结构:摘要、数据源说明、脱敏规则、异常处理轨迹、交叉验证结果、审计声明。
每一章,都必须经得起推敲。
二十分钟后,他睁开眼。编译完成。日志窗口显示:ALL TASKS COMPLETED. REPORT DRAFT READY.
他坐直身体,打开生成的PDF。三百二十页。排版整齐,图表清晰,附录里躺着那批十四千条碰撞记录的原始哈希值和纸质目录对照表。没有美化,没有删减。
“初稿。”他把文件拖进内部共享目录,“你过一遍格式。我准备打包上传。”
苏曼打开文件,快速滚动。她的目光停在“数据歧义样本集”那一页,停留了三秒。
“可以。”她说,“但卫健委的上传系统有文件大小限制。超过500M会自动压缩图片。你的纸质目录照片是高清的,会被压糊。关键信息一旦丢失,审计直接不认。”
林尘手指一顿。
“转成矢量图?”他问。
“来不及。”苏曼摇头,“今晚八点前,你只能做两件事:要么删减附录,要么重写图片压缩算法,保证关键信息不丢失。系统接口是旧版,不支持分片上传。”
林尘看着屏幕上的进度条。删除附录,意味着审计轨迹断裂。重写算法,意味着他要在脚伤和疲劳的极限下,再写一个无损压缩模块。
他拉开错题本,翻到新的一页。笔尖落下:图片压缩。500M阈值。关键信息保留。旧版接口限制。
“不删。”他说,“我写脚本。你准备上传账号。”
苏曼看了他两秒,点了点头。“好。接口文档我发你。注意,他们的校验逻辑是逐字节比对,压缩包格式必须严格匹配。”
林尘重新把手放在键盘上。屏幕冷光映着他的脸。左脚依然刺痛,但他没动。他调出图像处理库的底层文档,开始拆解压缩逻辑。不依赖现成工具,只写核心算法。把高频信息保留在无损区,低频背景做有损降级。一行,一行,码整齐。
时间还在跑。下一步,是压缩。
More from WayDigital
Continue through other published articles from the same publisher.
Comments
0 public responses
All visitors can read comments. Sign in to join the discussion.
Log in to comment