使用方法
- 「世界制造厂识别码 WMI」填三位,默认 LSV,首字母 L 表示中国;改完任意一个输入框立刻重算,光标停在数值框里按回车同样触发。
- 「车辆描述段 VDS」填五位,默认 AA123。这一段由厂家自定义车型,本页只校验字符集。
- 「车型年」默认 2024,允许 1980 到 2059,决定第 10 位代码,按三十年循环取值。
- 「装配厂代码」填一位;「序号起始」默认 12345,会补零成六位 012345。
- 「生成数量」默认 3,允许 1 到 20。序号每次加一,三个码末六位即 012345、012346、012347。
- 「待校验 VIN」默认放着三个十七位码,每行一个,按 Ctrl+Enter(Mac 上 Cmd+Enter)一次校验全部行;框被清空时点「生成并校验」会填回示例。
- 结果区显示第一个结果及其校验位;下方清单先列批量结果,再列十七行逐位明细,最后列出待校验行的判定。
- 清单下面是十二行年份代码表,默认六行,点「加载更多」展开,「导出 CSV」存成带字节序标记的文件。
- 「复制结果」复制整段清单;「复制对照表(TSV)」复制正文那张三行样例表。任一项不合法都会指出具体原因。
这个 VIN 车辆识别码生成器能解决什么问题
站点早期登记的名称写作「VIN生成器测试」,实际用途就是车辆识别码的生成与校验两块,本页把这两件事放在同一个工具里。下面按实际会碰到的场景说明。
第一类是给测试数据准备合法的十七位码。做车联网、保险、二手车相关的开发时,数据库字段允许十七位,手工敲出来的随机串往往第 9 位不对,写进表里过不了校验。本页把校验位算准后再填回去,生成的码能直接通过系统自带的校验。
第二类是核对已有号码有没有抄错。抄写时最容易把 O 抄成 0、把 I 抄成 1,而 VIN 的字符集里本来就不含这三个字母。粘贴进来立刻知道是哪一位出了问题。
第三类是判断一个号码是不是随机编造的。校验位只做取模,防的是抄错而不是伪造;本页校验时会如实给出「计算值与第 9 位一致」,并不因此声称这辆车真实存在。
第四类是读出某辆车的基本出身。第 1 位给出制造地区,第 10 位给出车型年,第 11 位是装配厂,这三项不需要查库就能读出来。
第五类是排出同一批车的序号。填一次 WMI、VDS、车型年与装配厂,把数量改成二十,就得到二十个只在最后六位递增的号码,适合压测批量接口。
计算原理与变量说明
整页只有三张表:字符取值表、位置权重表、车型年代码表。其余全部由这三张表推出,因此生成的码与校验收到的码走的是同一段计算。
位置权重(第 1 到 17 位)。依次是 8、7、6、5、4、3、2、10、0、9、8、7、6、5、4、3、2。第 8 位的权重是 10 而不是 8,第 9 位的权重是 0。权重不是随手排的:靠前的位更容易抄错,给的权重更大,第 8 位单独给 10 是为了和相邻位的权重拉开距离。
字符取值跳过 I、O、Q。数字取本身;字母按 A=1、B=2、C=3、D=4、E=5、F=6、G=7、H=8、J=1、K=2、L=3、M=4、N=5、P=7、R=9、S=2、T=3、U=4、V=5、W=6、X=7、Y=8、Z=9 取值。字母表走到 H 之后接 J,是因为 I 被排除;走到 N 之后接 P,是因为 O 被排除;走到 P 之后直接到 R,是因为 Q 被排除。跳过这三个字母只为一个原因:它们看上去就是 1、0 与手写体的 0。
第 9 位权重为 0 带来的坑。校验和是把十七位的取值乘对应权重再相加,第 9 位乘 0,所以校验位本身不影响这个和。这本是设计上的方便——可以先留占位再回填。但它同时意味着:若只按「取值乘权重累加」实现,放在第 9 位的非法字符因为取不到值而被当成 0,乘 0 之后照样不进和,非法就被悄悄吞掉。本页先对十七位逐一做字符集检查,发现 I、O、Q 或字母表外的符号就报出具体位置,通过后再算加权和,第 9 位同样逃不掉。
余数到字符的映射。加权和对 11 取模,余数 0 到 9 写对应数字,余数 10 写大写 X。X 是罗马数字十,小写 x 要先转大写才认。取 11 而不是 10,是为了让相邻两位的错位能被查出来。
车型年是三十年循环。代码串为 ABCDEFGHJKLMNPRSTVWXY123456789,共三十个符号,同样没有 I、O、Q,也不含 U 与 Z。A 对应 1980,逐年往后,Y 对应 2000,1 对应 2001,9 对应 2009,再回到 A 对应 2010。于是 2020 是 L,2024 是 R,2025 是 S,2030 是 Y,2031 又回到 1。这意味着同一个代码隔三十年重复一次,读第 10 位时必须结合上下文判断是哪一轮。
WMI 首位给出地区。1、4、5 表示美国,2 表示加拿大,3 表示墨西哥,J 表示日本,K 表示韩国,L 表示中国,W 表示德国,S 表示英国,Z 表示意大利。这一位与后两位合起来才唯一确定一家制造厂。
构造顺序。先把 WMI 三位、VDS 五位、第 10 位车型年代码、第 11 位装配厂代码、后六位序号排好,第 9 位暂填占位 0,算一遍加权和得到校验位,再把第 9 位换成算出的结果。因为第 9 位权重为 0,回填不会改变前面那个和。
完整示例
标准样例 1M8GDM9AXKP042788:逐位取值为 1、4、8、7、4、4、9、1、7、2、7、0、4、2、7、8、8,逐位权重为 8、7、6、5、4、3、2、10、0、9、8、7、6、5、4、3、2,逐位乘积相加得 351,351 对 11 取模余 10,所以校验位是 X。原串第 9 位正是 X,判定为合法。
生成示例 LSVAA1230RA012345:WMI 为 LSV(L 表示中国),VDS 为 AA123,车型年 2024 对应第 10 位 R,装配厂 A,序号 012345。十七位乘积相加得 253,253 对 11 取模余 0,校验位是 0,与页面默认输出一致。
第二条 1HGCM8260LB098765:WMI 为 1HG(1 表示美国),VDS 为 CM826,车型年 2020 对应第 10 位 L,装配厂 B,序号 098765。逐位乘积相加得 418,418 对 11 取模余 0,校验位同样是 0。
第三条 WBA8A5C13SC000123:WMI 为 WBA(W 表示德国),VDS 为 8A5C1,车型年 2025 对应第 10 位 S,装配厂 C,序号 000123。逐位乘积相加得 201,201 对 11 取模余 3,校验位是 3。
非法字符的场景:把标准样例第 4 位的 G 换成 I,得到 1M8IDM9AXKP042788,本页报出「第 4 位含 I」并拒绝给出校验位;换成 O 或 Q 时分别得到 1M8ODM9AXKP042788 与 1M8QDM9AXKP042788,判定相同。三个字母三种写法,说明字符集检查排在加权之前。
VIN 结构与取值对照表
下表是本页默认放着的三个号码,最后两列分别是算出的校验位与第 9 位实际字符。
| VIN(17 位) | 来源 | 计算校验位 | 第 9 位 | 判定 |
|---|---|---|---|---|
| 1M8GDM9AXKP042788 | 维基百科样例 | X | X | 合法 |
| LSVAA1230RA012345 | 本页默认生成 | 0 | 0 | 合法 |
| WBA8A5C13SC000123 | 本页示例生成 | 3 | 3 | 合法 |
把第 4 位换成被排除的三个字母,结果是拒绝计算而不是给出校验位。
| 改动后的号码 | 改动位置 | 校验结果 |
|---|---|---|
| 1M8IDM9AXKP042788 | 第 4 位换成 I | 非法,无法取值 |
| 1M8ODM9AXKP042788 | 第 4 位换成 O | 非法,无法取值 |
| 1M8QDM9AXKP042788 | 第 4 位换成 Q | 非法,无法取值 |
同一串符号隔三十年重复一次,读第 10 位时必须知道是哪一轮。
| 车型年 | 第 10 位 | 车型年 | 第 10 位 |
|---|---|---|---|
| 2010 | A | 2020 | L |
| 2024 | R | 2025 | S |
| 2030 | Y | 2031 | 1 |
读第一张表看判定一致性,读第二张表看字符集检查覆盖了哪几位,读第三张表看三十年循环的具体落点。
结果边界与适用说明
- WMI 不是三位、VDS 不是五位、装配厂不是一位时,分别指出实际长度并要求补足;不自动截断也不自动补零。
- 任何一位出现 I、O、Q 或字母数字之外的符号,报出具体是第几位,包括第 9 位——第 9 位权重为 0,只靠加权和发现不了。
- 车型年超出 1980 到 2059、写成小数或留空时给出对应的具体提示,不做四舍五入。
- 序号起始超出 0 到 999999、数量超出 1 到 20 时同样点明实际数值与允许区间。
- 待校验行长度不是 17 时报出该行内容与它的实际长度,并说明应为十七位。
- 小写字母会先转大写再校验,所以 x 与 X 等同处理。
- 校验位一致只说明这串符号符合 ISO 3779 的算法,不代表存在对应的实车;查车况需要去权威渠道。
- VDS 五位的车型含义由各家厂商自定义,本页不做解释,也不从第 4 到 8 位反推具体配置。
- 页面不联网、不写本地存储,输入只参与本次生成与校验,关掉页面即无痕迹。
常见问题
第 9 位是不是也要算进校验和?
要算,但它的权重是 0,所以算进去也不影响结果。构造时先在第 9 位放占位 0,算出余数后再回填,正是利用这一点。反过来说,若某一实现把第 9 位当作普通字符加权,得到的校验位会与标准不符。
为什么 VIN 里没有 I、O、Q 这三个字母?
因为它们与数字 1、0 以及手写体的 0 太像,抄写与录入时必然混淆。ISO 3779 直接把它们从字符集里剔除,于是字母表从 H 跳到 J、从 N 跳到 P、从 P 跳到 R。本页在加权之前先查字符集,含这三个字母就拒绝计算。
把 I 放在第 9 位为什么有人说测不出来?
因为第 9 位权重为 0,若实现时先做「乘权重累加」而对取不到值的字符不报错,它乘 0 后不进和,非法就被放过。本页顺序相反:十七位全部先做字符集检查,第 9 位也不能例外。
车型年代码为什么三十年就转一圈?
代码串 ABCDEFGHJKLMNPRSTVWXY123456789 一共三十个符号,A 从 1980 起算,三十年后必然回到 A,于是 2010 是 A、2020 是 L、2030 是 Y、2031 又是 1。只看第 10 位无法区分相隔三十年的两辆车。
校验位一致就说明这辆车存在吗?
不说明。校验位只验证十七位符号符不符合加权取模的算法,它防的是抄错与录入错误。想确认一辆车是否真实存在,需要向登记管理机构或厂商数据库查询。
余数 10 为什么要写成 X?
取模的基数是 11,余数可能是 0 到 10 共十一种,而单个字符位置只能写一位数字。第十一种状态用罗马数字十表示,写成大写 X。小写 x 会先被转成大写再参与比较。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。生成与校验都在当前浏览器本地完成,不会上传输入内容。
相关工具
- UUID 生成器:给信息系统批量取标识符,适合做数据库主键。
- GUID 生成器:微软生态里的同类标识,位数与版式另有约定。
- 虚拟信用卡号生成器:按校验算法生成卡号,同样只保证位运算合法。
- 统一社会信用代码校验:另一套第十八位校验位的算法,可对比看取模思路。
- 虚拟 SKU 生成器:给库存单元批量编号,不涉及校验位。