VIN 码 / 车架号生成器
VIN(Vehicle Identification Number)= 17 位车辆识别号,按 ISO 3779 / GB 16735 标准生成(含第 9 位校验码)。仅用于开发测试 / 数据填充。
17 位车架号(合规校验)
VIN(Vehicle Identification Number)= 17 位车辆识别号,按 ISO 3779 / GB 16735 标准生成(含第 9 位校验码)。仅用于开发测试 / 数据填充。
· 第 1-3 位 WMI(World Manufacturer Identifier):国家 + 厂商代码
· 第 4-8 位 VDS(Vehicle Descriptor Section):车型 / 系列 / 车身样式
· 第 9 位:校验位(GB 16735 算法 0-9 或 X)
· 第 10 位:年份码(A=2010, B=2011, ..., 1=2031)
· 第 11 位:装配厂代码
· 第 12-17 位:流水号
· 排除字母:I / O / Q(防混淆)
了解工具定位 · 使用场景 · 对比优势
输入一段疑似伪造的 17 位车架号(VIN),工具自动校验其结构合规性,包括校验位计算与字符规则。二手车商、保险定损员、车辆检测人员快速筛查明显不合规的 VIN,减少人工核对时间。所有计算在浏览器内完成,数据不上传服务器。
买二手车时,卖家提供的 VIN 码可能拼接篡改或来自事故报废车。用本工具校验 VIN 码的 17 位结构、校验位、地区代码与车型年份逻辑一致性,5 秒内识别格式违规或逻辑矛盾,避免买到套牌车或抵押车。
车管所或保险公司调档时,纸质单据上的 VIN 码可能因印刷模糊导致录入错误。逐位输入 17 位字符后,工具自动校验校验位,并高亮异常位置(如第 9 位校验值不匹配),帮助工作人员在 1 分钟内完成人工核对。
汽修厂接到一台无铭牌事故车,只能凭残存车架号段采购配件。输入残缺的 VIN 码片段(如前 11 位),工具按 WMI(世界制造商识别码)和 VDS(车辆描述段)规则补全可能的后 6 位组合,缩小配件型号搜索范围。
保险经纪收到客户发来的 VIN 码截图,需确认码是否属于可保车型。粘贴 17 位码后,工具校验第 10 位(年份代码)是否在当前保险有效期内,以及第 1-3 位(制造商代码)是否在保司承保清单内,避免无效报价。
租车公司批量采购新车时,需逐一校验 50 辆车的 VIN 码与合格证是否一致。将 50 个码粘贴到工具中(每行一个),工具批量输出校验结果(通过 / 第 X 位异常),将人工核对时间从 2 小时压缩到 5 分钟。
| 维度 | 本工具 | 竞品 A (vindecoderz.com) | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,VIN 码不上传任何服务器 | VIN 码上传至第三方服务器进行查询 | VIN 码需提供给 4S 店或车管所工作人员 |
| 处理速度 | 即时校验,输入完成即出结果 | 需等待服务器响应,通常 3-10 秒 | 需人工查询或等待系统响应,通常数小时至数天 |
| 离线可用 | 完全离线,断网环境也可使用 | 必须联网 | 必须联网或前往线下网点 |
| 校验深度 | 仅校验 17 位格式合规性(字符、校验位) | 校验格式 + 查询车辆品牌、型号等数据库信息 | 校验格式 + 查询车辆完整档案 |
| 使用门槛 | 无需注册,打开页面即用 | 部分功能需注册或付费 | 需携带证件前往指定地点 |
| 收费模式 | 完全免费 | 基础免费,深度查询或批量查询需付费 | 通常免费,但需花费时间成本 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| LSVAU2A32N2100001 | WMI: LSV (上汽大众) | VDS: AU2A32 | VIS: N2100001 | 校验位: 2 (正确) | 典型场景:常见的国产合资品牌 VIN |
| WBA3A5C5XDF123456 | WMI: WBA (宝马) | VDS: 3A5C5 | VIS: XDF123456 | 校验位: 5 (正确) | 典型场景:进口豪华品牌 VIN |
| 1HGCM82633A004352 | WMI: 1HG (本田美国) | VDS: CM826 | VIS: 33A004352 | 校验位: 3 (正确) | 典型场景:北美生产的日系品牌 VIN |
| LSVAU2A32N210000 | 错误:VIN 码长度不足 17 位 | 边界 case:输入少了一位,常见复制粘贴遗漏 |
| LSVAU2A32O2100001 | 错误:第 10 位字符 'O' 不合法(VIN 中禁止使用字母 I、O、Q) | 易错 case:用户误输入字母 O 而非数字 0 |
| WDB4632321X123456 | WMI: WDB (奔驰) | VDS: 463232 | VIS: 1X123456 | 校验位: 1 (正确) | 典型场景:奔驰越野车(G 级)VIN |
| 11111111111111111 | WMI: 111 (无效) | VDS: 111111 | VIS: 11111111 | 校验位: 1 (错误,应为 5) | 边界 case:全 1 的 VIN,校验位必然错误 |
| JN1TBNT30A0000001 | WMI: JN1 (日产日本) | VDS: TBNT30 | VIS: A0000001 | 校验位: 0 (正确) | 边界 case:序列号全 0 开头的早期 VIN |
LSVHJ133022LSVHJ133022221234VIN 码标准(ISO 3779)规定固定 17 位字符;不足 17 位说明输入有遗漏或非完整车架号,校验逻辑会直接拒绝
WDBOJ56D61F123456WDBUJ56D61F123456VIN 码标准禁止使用 I、O、Q 以避免与数字 1、0、9 混淆;输入这些字母会被判定为无效字符
1G1BL52P7TR115520(原车校验位应为 5)1G1BL52P5TR115520第 9 位是根据前 8 位和后 8 位通过加权算法计算出的校验位;输错会导致合规校验失败,提示 VIN 无效
1FAFP404XWF123456(W 不是有效年份字符)1FAFP404X1F123456(1 代表 2001 年)第 10 位代表车型年份,仅使用特定字母和数字(如 A=1980, 1=2001, L=2020);U、Z、0 不在年份映射表中
1G1 BL52P 5TR1155201G1BL52P5TR115520VIN 码是连续 17 位无分隔符字符串;空格、连字符、下划线等均视为非法字符,工具会直接报错
1g1bl52p5tr1155201G1BL52P5TR115520VIN 码标准要求大写字母;小写字母虽可自动转换,但部分校验算法(如校验位计算)依赖大写原始值,建议直接输入大写
输入发动机号 12345678 到 VIN 校验工具输入完整 17 位车架号(如挡风玻璃左下角或铭牌上的字符串)VIN 码是整车唯一标识,17 位;发动机号通常 6-12 位且无统一格式,两者完全不同,校验规则不适用
输入日本 12 位车架号(如 JHM-EJ-123456)输入符合 ISO 3779 标准的 17 位 VIN该工具基于 ISO 3779 标准(北美/中国/欧洲主流)校验;日本、部分旧款欧洲车使用非 17 位格式,无法通过校验
公式推导 · 流程图解 · 依据出处
VIN = WMI(3) + VDS(6) + VIS(8)
WMI — 世界制造商代码,前 3 位VDS — 车辆描述部分,第 4-9 位VIS — 车辆指示部分,第 10-17 位第 9 位 — 校验位,通过加权计算验证以 VIN=1HGCM82633A004352 为例:WMI=1HG(本田美国),VDS=CM8263(车型/发动机/校验位),VIS=3A004352(年份/工厂/序列号)。校验位计算:将各字符按对应值乘以权重(位置 1-8 权重 8-2,位置 10-17 权重 9-10),求和后除以 11,余数对应校验位值。此例校验位为 3,与第 9 位一致,VIN 合法。
适用于全球 ISO 3779 标准下的 17 位 VIN 码校验。不适用于非标准长度(如 11 位旧格式)或自定义编码。校验算法源自 ISO 3779:2009 及 SAE J853 标准。
3 种主流语言 · 复制即用
import re
def validate_vin(vin: str) -> bool:
"""校验17位车架号格式与校验位"""
if not re.fullmatch(r'[A-HJ-NPR-Z0-9]{17}', vin):
return False # 排除I、O、Q
# 字符映射表
map_char = {c: i for i, c in enumerate('0123456789')}
map_char.update({'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})
# 权重(位置从1开始)
weights = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2]
total = sum(map_char.get(c, 0) * w for c, w in zip(vin, weights))
check_digit = total % 11
if check_digit == 10:
check_digit = 'X'
else:
check_digit = str(check_digit)
return vin[8] == check_digit
# 示例
print(validate_vin('1HGCM82633A004352')) # True
print(validate_vin('1HGCM82633A004353')) # Falsepackage main
import (
"fmt"
"regexp"
"strings"
)
func validateVIN(vin string) bool {
// 排除 I、O、Q
matched, _ := regexp.MatchString(`^[A-HJ-NPR-Z0-9]{17}$`, vin)
if !matched {
return false
}
charMap := map[rune]int{
'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,
'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,
}
weights := []int{8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2}
total := 0
for i, c := range strings.ToUpper(vin) {
val, ok := charMap[c]
if !ok {
return false
}
total += val * weights[i]
}
check := total % 11
checkChar := fmt.Sprintf("%d", check)
if check == 10 {
checkChar = "X"
}
return string(vin[8]) == checkChar
}
func main() {
fmt.Println(validateVIN("1HGCM82633A004352")) // true
fmt.Println(validateVIN("1HGCM82633A004353")) // false
}function validateVIN(vin) {
// 排除 I、O、Q
if (!/^[A-HJ-NPR-Z0-9]{17}$/i.test(vin)) return false;
const charMap = {
'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,
'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
};
const weights = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2];
const upper = vin.toUpperCase();
let total = 0;
for (let i = 0; i < 17; i++) {
const val = charMap[upper[i]];
if (val === undefined) return false;
total += val * weights[i];
}
let check = total % 11;
if (check === 10) check = 'X';
else check = String(check);
return upper[8] === check;
}
// 示例
console.log(validateVIN('1HGCM82633A004352')); // true
console.log(validateVIN('1HGCM82633A004353')); // false8 个高频疑问