构建 VIN 解码模式的社区贡献系统

发布: (2026年3月13日 GMT+8 08:25)
3 分钟阅读
原文: Dev.to

Source: Dev.to

Overview

VIN 解码模式社区贡献系统的封面图片

VIN 解码听起来很简单,直到你意识到每个制造商的实现方式都不同,而权威数据库(NHTSA VPIC)只覆盖美国市场的车辆。

我们维护 Corgi,一个开源离线 VIN 解码器。为了解决国际车辆的问题,我们构建了一个社区贡献系统。下面介绍它的工作原理。

The Problem

VIN(车辆识别码)由 17 位字符组成:

  • 第 1‑3 位: WMI(世界制造商标识码)
  • 第 4‑8 位: 车辆属性(车型、发动机等)
  • 第 9 位: 校验位
  • 第 10 位: 车型年份
  • 第 11 位: 工厂代码
  • 第 12‑17 位: 序列号

NHTSA 的 VPIC 数据库将 WMI 映射到制造商,并定义了第 4‑8 位的解释方式,但它仅覆盖在美国销售的车辆。

示例:

  • 特斯拉上海工厂使用 WMI LRW
  • 特斯拉柏林工厂使用 WMI XP7

这两个 WMI 在 VPIC 中都不存在。

Our Solution: YAML Patterns

贡献者添加一个 YAML 文件来描述新的 WMI:

wmi: LRW
manufacturer: Tesla
make: Tesla
country: China
vehicle_type: Passenger Car
years:
  from: 2020
  to: null

sources:
  - type: service_manual
    description: Tesla Model 3/Y VIN decoder
    url: https://example.com/source

patterns:
  - pattern: "3E****"
    element: Model
    value: Model 3
  - pattern: "YG****"
    element: Model
    value: Model Y
  - pattern: "*D****"
    element: Drive Type
    value: AWD
  - pattern: "*C****"
    element: Drive Type
    value: RWD

test_vins:
  - vin: LRW3E7FA6NC433523
    expected:
      make: Tesla
      model: Model 3
      drive_type: RWD

Validation Pipeline

当 PR 被打开时,CI 会运行多项检查。

Schema Validation (Zod)

const wmiFileSchema = z.object({
  wmi: z.string().length(3).regex(/^[A-HJ-NPR-Z0-9]{3}$/),
  manufacturer: z.string().min(1),
  make: z.string().min(1),
  country: z.string().min(1),
  vehicle_type: z.enum(VALID_VEHICLE_TYPES),
  years: yearsSchema,
  patterns: z.array(patternSchema).min(1),
  test_vins: z.array(testVinSchema).min(1),
});

Check Digit Verification

每个测试 VIN 必须拥有有效的校验位(第 9 位):

function validateCheckDigit(vin: string): boolean {
  const weights = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2];
  const transliteration = { A:1, B:2, /* … */ };

  let sum = 0;
  for (let i = 0   
  • npm:
0 浏览
Back to Blog

相关文章

阅读更多 »

Meta 不再放弃 Jemalloc

- Meta 认识到 jemalloc 作为高性能内存分配器在其软件基础设施中的长期收益。 - 我们正在重新聚焦 jemalloc,……