TL;DR> > 一位开发者创建了一个会在你收到有趣数字(如 314159 π、123456、777777)时提醒你的 2FA 应用。这看似无用的功能,却体现了编程中最宝贵的品质:在技术中寻找乐趣,在实用中保留诗意。


📋 本文结构

  1. 那个有趣的 side project
  2. 2FA 的枯燥现实
  3. 数字的诗意
  4. 技术实现细节
  5. 为什么无用之物有价值
  6. 扩展想法:更多”魔法数字”
  7. 开发者的乐趣哲学
  8. 结语:保持好奇心

那个有趣的 side project

Reddit 上最近有一个可爱的项目:

“The 2FA app that tells you when you get 314159

开发者 Jacob 创建了一个 iOS 2FA 应用,但它的特别之处不在于安全性或 UI 设计——而在于它会检测你的 2FA 码是否包含”有趣的数字模式”。

当你登录账户,收到一个验证码,如果这个数字恰好是:

  • 314159 — π 的前六位
  • 123456 — 连续数字
  • 777777 — 重复数字
  • 111111 — 重复数字

应用会推送一个通知:”嘿,你收到了一个特别的验证码!”

评论区的反应分为两派:

  • “This one takes the pie.. I mean PI” (这是个双关:pie/π)
  • “I love your honesty about the problems you faced and poor old France” (开发者还吐槽了法国电话号码格式的问题)

2FA 的枯燥现实

让我们先承认:2FA 很烦人。

每次登录都要:

  1. 掏出手机
  2. 打开 Authenticator 应用
  3. 找到对应的账户
  4. 记住 6 位数字
  5. 在 30 秒内输入
  6. 如果超时了,重来

这是一个必要的安全措施,但毫无乐趣可言。

2FA 应用的同质化

市面上的 2FA 应用:

  • Google Authenticator:简洁,但功能单一
  • Authy:云同步,但界面平庸
  • Microsoft Authenticator:企业级,但笨重

它们都解决了同一个问题:生成 TOTP 码

但没有人问过:这个体验能不能更有趣一点?


数字的诗意

Jacob 的项目提醒我们:数字不只是工具,它们可以有故事

π (Pi)

314159...

圆周率,数学中最著名的常数。它出现在每一个圆中,却永远无法被完全写出。

当你的 2FA 码恰好是 π 的前六位,这概率是多少?

P = 1 / 10^6 = 0.0001%

百万分之一的机会。比中彩票难,但比被雷劈中容易。

其他”魔法数字”

数字 含义 概率
123456 连续递增 1/10^6
654321 连续递减 1/10^6
111111 重复 1/10^6
777777 幸运数字 1/10^6
000000 归零 1/10^6
252525 重复模式 1/10^6
112233 双重重复 1/10^6
314159 π 1/10^6

如果检测所有这些模式,概率大约是 8/10^6 = 0.0008%

仍然很小,但比只检测 π 高了 8 倍。

数学之美

这个项目无意中触及了一个数学概念:模式识别

人类大脑天生寻找模式。我们看到云朵中的面孔,在随机数据中发现趋势。

在无尽的 2FA 码流中发现 π,就像在沙滩上找到一颗特别的贝壳——它本身没有实用价值,但带来了发现的喜悦。


技术实现细节

这个项目虽然简单,但涉及一些有趣的技术点。

TOTP 算法

2FA 码通常使用 TOTP(Time-based One-Time Password)算法:

import hmac
import hashlib
import struct
import time
import base64

def generate_totp(secret: str, digits: int = 6) -> str:
    """Generate TOTP code."""
    # Base32 decode secret
    key = base64.b32decode(secret.upper())
    
    # Get current counter (30-second window)
    counter = struct.pack('>Q', int(time.time()) // 30)
    
    # HMAC-SHA1
    mac = hmac.new(key, counter, hashlib.sha1).digest()
    
    # Dynamic truncation
    offset = mac[-1] & 0x0f
    binary = struct.unpack('>I', mac[offset:offset+4])[0] & 0x7fffffff
    
    # Modulo to get 6 digits
    otp = binary % (10 ** digits)
    return f"{otp:0{digits}}"

模式检测

// Swift 示例
class MagicNumberDetector {
    static let magicPatterns: [(String, String)] = [
        ("314159", "π"),
        ("123456", "连续递增"),
        ("654321", "连续递减"),
        ("111111", "重复数字"),
        ("777777", "幸运数字"),
        // ... 更多模式
    ]
    
    static func check(code: String) -> String? {
        for (pattern, meaning) in magicPatterns {
            if code.contains(pattern) {
                return "✨ 发现魔法数字:\(meaning)!"
            }
        }
        return nil
    }
}

推送通知

import UserNotifications

func notifyMagicNumber(code: String, meaning: String) {
    let content = UNMutableNotificationContent()
    content.title = "✨ 魔法 2FA 码!"
    content.body = "你收到了 \(meaning)\(code)"
    content.sound = .default
    
    let request = UNNotificationRequest(
        identifier: UUID().uuidString,
        content: content,
        trigger: nil
    )
    
    UNUserNotificationCenter.current().add(request)
}

挑战:法国电话号码

开发者在博客中提到一个有趣的 bug:

“I love your honesty about the problems you faced and poor old France”

法国电话号码格式与其他国家不同(以 +33 开头,省略前导零),这导致了一些解析问题。

这是 side project 的常见问题:你永远不知道会踩到哪个奇怪的边界情况


为什么无用之物有价值

有人可能会问:这有什么用?

答案是:没有实用价值,但有人文价值

1. 对抗单调

安全检查不应该等于枯燥体验。一点小小的惊喜可以让日常任务变得有趣。

2. 培养观察力

当你开始期待”魔法数字”,你会更注意身边的数字。这种观察力的训练是隐性的。

3. 社区连接

这个简单的功能成为了 Reddit 上的话题。人们分享自己收到的有趣数字,形成了小小的社区时刻。

4. 技术展示

这是一个完美的”技术演示”项目——展示了 TOTP、推送通知、模式识别,但包裹在一个有趣的包装中。


扩展想法:更多”魔法数字”

如果我要 fork 这个项目,我会添加:

数学常数

e (欧拉数): 271828
φ (黄金比例): 161803
√2: 141421
√3: 173205

流行文化

42: 生命、宇宙以及任何事情的终极答案
420:  you know what
69:  meme number
80085: 计算器上的经典

历史日期

140606: 2014年6月6日,诺曼底登陆70周年
690711: 1969年7月11日,阿波罗11号发射

回文数

123321
456654

数学性质

完美平方:144(12²)、169(13²)、196(14²)
完美立方:125(5³)、216(6³)、343(7³)
斐波那契数列:112358(前6位)

开发者的乐趣哲学

Jacob 的项目体现了编程中一个重要的但经常被忽视的品质:乐趣

专业 vs 乐趣

现代软件开发往往过于严肃:

  • 性能优化
  • 安全加固
  • 可扩展性设计
  • 测试覆盖率

这些都是必要的,但如果只有这些,编程会变成苦役。

乐趣的价值

乐趣在编程中的价值:

  1. 动机:有趣的 projects 更容易坚持
  2. 创造力:玩耍的心态激发创新
  3. 学习:在有趣的项目中不知不觉学到新技术
  4. 社区:有趣的项目更容易获得关注

平衡

这不意味着所有项目都要是玩具。而是:即使在严肃的项目中,也保留一点玩乐的空间


结语:保持好奇心

Jacob 的 2FA π 应用提醒我们:技术不仅是工具,也是表达

它表达了对数学之美的欣赏,对日常体验的诗意提升,以及对”技术必须严肃”这一假设的温柔反抗。

在追逐性能指标、KPI 和交付日期的过程中,不要忘记:你最初为什么选择编程?

很可能是因为——它很有趣。

“Keep it fun, keep it weird.”

保持有趣,保持怪异。


参考与延伸阅读


本文灵感源自 2026-03-16 Reddit r/programming 讨论。

发布于 postcodeengineering.com