在软件中需要加入一些为用户个性化定制的内容推送,因此需要一个用户标识。
正常情况下,如果用户有登录,就是一个 UserID 的事情。然而我们这次的场景是匿名使用,所以没有这个 UserID 可以用,需要自己来生成一个。
以及,产品设计上希望能做到还是能大致识别到一个「人」。同一台机器上如果有多个我们的软件,最好能得到相同的 ID。因此最后商量下来决定采用设备 ID(或设备指纹)的方式。
如果是 Web 浏览器,算是有相对成熟的方案。浏览器指纹也不是一两个人在做了,「广告」这个需求天然就需要这种东西。然而我们是 MFC 程序,需要自己想办法。
我以前做 Shareware 的时候也大致接触过一些 DeviceID 的东西,知道这种事情吃力不讨好。很难覆盖那么多种类的硬件,特别有一些可能还是服务器上才能见到的东西。万一搞不好,说不定在某些特殊硬件上还要出什么状况,所以并不是一件容易的事情。所幸我们这次的事情并不是性命攸关的「注册码」,只是一个可有可无的身份标识,即使拿不到,也可以接受,因此压力没那么大。
很自然地,我想到了让 AI 来做这个事情。说到「见多识广」,可能没有人比得上它。知识结构也是它比较新,不用担心去网上找到的开源代码只能支持老旧硬件的事情。把需求描述给了它,很快就生成了一个函数,专门用来在 Windows 上得到 DeviceID。
自测的时候,问题来了:DeviceID 有时候会变。
其实这个问题一早就埋下了,是我需求没向AI说清楚,算我的锅。
说起来,这类需求虽然都可以描述为 DeviceID,但实际上是不同的:
- 用于区分两台设备;
- 用于追踪使用者。
两者是有大区别的。前一种就最好是有点变化就换个 ID,后一种则应该只要怀疑可能还是原来那台,那 ID 就不要动。
但是,这种事情确实不太好把握。加根内存条算不算新设备?可能不应该算。那换块硬盘呢?如果 CPU 升了个级,心脏都变了,还说没变化,有点说不过去吧?以及,如果用户把操作系统从正版的 Win10 家庭版给重装成了盗版 Win11 专业版呢?
![]() |
| 图片由 Google Gemini 3 Pro + Nano Banana Pro 生成 |
我们的需求肯定是希望尽可能不要因为一丁点儿变化就换一个 DeviceID。但这事是一个「忒修斯之船」悖论。变到什么程度才算一台新设备?如果太过追求某一个极端,就会落入两头的陷阱。要确保 DeviceID 的「排他性」,就需要冒「稳定性」不佳的风险。
AI一开始给出来的方案,「稳定性」是不够好的。即使硬件和 OS 都没有发生变化,它也可能会变。据说是多核 CPU 的线程绑定带来的问题。麻烦在于,如果我不从需求侧来反推,以及没有进行足够数量的测试,很可能发现不了。
解决了这个问题,还有另外一个问题:如何保证这段用于生成 DeviceID 的代码,在各种硬件上都能稳定运行?
我们的要求很低:如果不能保证生成 DeviceID,那就别生成,或者生成一个可能会重复的,都 OK。这算是允许牺牲 DeviceID 的「稳定性」,来换取更好的「鲁棒性」。这个需求我从一开始就给了 AI,它的确也在代码上作了处理,我有看到。然而,如何保证呢?作更多的测试?
我目前能想到的:在调用的时候套一个 try...catch,不知道有没有用。另一个我知道肯定有用的办法,就是把这个事情扔给一个独立的进程来做,这样应该可以保证万无一失。软件运行架构会需要一点调整。我知道这样去做,AI 呢?你如果只是把它限制在写函数这件事情上的话,它肯定没法告诉你答案。
这种事情,让 Claude Code 来做,能更好吗?如果让 OpenClaw 放开手脚不限费用地去干,它最终能搞定吗?GIGO,如果人想偷懒的话,估计就会很难。










