使用方法
本页把随机条码的生成做成可反复试算的小工具,打开就带一组非空示例,不必先输入就能看到完整结果。想生成自己的批量条码,只用调整两个数字框:第一个是「生成数量」,决定一次要多少条条码,范围 1 到 100;第二个是「固定种子」,决定这批随机数是怎么来的,同一个种子永远得到同一批条码,方便复现与团队对照。任意一个数字框里按回车键 Enter(不加 Ctrl、Cmd 或 Shift)就会立即重算,也可以直接点「生成条码」。
「显示方式」是一个勾选框:勾上时,结果区和表格里的 12 位数字会每 4 位插一个空格,例如 036000215182 显示成 0360 0021 5182,更接近收银小票和商品标签上的印刷样式;不勾时则输出连续数字串,适合直接喂给条码打印软件或数据库。勾选状态一变,结果区与表格会即时刷新,不需要重新生成。点「复制结果」把当前这一批条码收进剪贴板;点「载入示例」把数量和种子还原成默认样本。
下方对照表默认列出 12 行,每行给出序号、11 位前缀、末位校验位和完整 12 位(每 4 位分组),点「加载更多」展开到 18 行;可导出带 BOM 的 CSV,或按 TSV 复制整张表。结果区带 role="alert",读屏软件会朗读生成结果。每个输入框都给了 min、max、step:数量超出 1 到 100、种子不是正整数,都会弹出具体报错,不会静默当成 0 继续出数。
能解决什么问题
第一类需求是做条码格式与校验的演示和教学。很多人在学零售系统、库存管理或条码打印时,需要一个对照自己校验函数的样本。固定种子让演示可复现,全班算出来的是同一批条码,谁算错了一眼就能看穿。它输出结构合法、校验位正确的 12 位数字,可直接拿去验证你的 UPC-A 解析代码。
第二类需求是批量造测试数据。写条码扫描接口、做 EAN/UPC 校验中间件、压测入库流程时,常需要一大批「长得像真条码、但内容随机」的输入。逐条手敲既慢又容易把校验位算错;本页一次给几百上千个全带正确校验位的样本,且同一种子复现,方便回归测试时比对前后两次是否一致。
本页不解决这些事:它不绑定任何真实商品,不验证某段数字是否对应某个真实在售商品,也不能用于实际结算或贴到真实货品上。UPC-A 校验位防的是录入错误而非防伪;本页明确是格式与校验演示生成器,输出的条码仅供学习、测试和占位,不能当真实商品码用。
原理和变量
随机UPC生成器本质上是一个格式与校验演示工具,不绑定真实商品,只保证输出结构合法、校验位正确的 12 位数字。UPC-A 是北美通用的 12 位零售条码,最后一位是校验位。前 11 位承载商品与厂商信息(其中首位数字还有商品类别含义:0 是规则包装商品、2 是称重商品、3 是药品等),第 12 位是用前 11 位算出来的校验码。校验的目的很简单:扫描时如果某一位读错、或相邻两位顺序颠倒,重新算一遍校验位会对不上,于是立刻报错而不是默默收下错误数据。
校验位的算法是加权模 10。把前 11 位从左到右编号为第 1 到第 11 位,其中奇数位(第 1、3、5、7、9、11 位)权重为 3,偶数位(第 2、4、6、8、10 位)权重为 1。先求加权和:奇数位之和乘 3,再加上偶数位之和;把这个和记作 S。再取与 10 的差值补成 10 的倍数,得到校验位 cd = (10 - (S % 10)) % 10。注意末尾的 % 10 是为了让 S 正好是 10 的倍数时校验位等于 0,而不是变成 10。
用固定种子复现随机。本页的「随机」不是真随机,而是用一条可复现的线性同余公式:s = (Math.imul(s, 1103515245) + 12345) & 0x7fffffff,取数时取 Math.floor(s / 2147483647 * 10) 得到 0 到 9 之间的一个数字。每取一位就把种子推进一次,连续取 11 次就得到一条前缀;给定同一初始种子,每次算出来的前缀序列完全相同,所以「固定种子」勾选后生成的条码可跨机器、跨时间复现。
完整示例(逐步代入校验公式)
以本页内置校验示例走一遍完整链路。取前 11 位 03600021518:奇数位(第 1、3、5、7、9、11 位)是 0、6、0、2、5、8,和为 21;偶数位(第 2、4、6、8、10 位)是 3、0、0、1、1,和为 5。加权 S = 21×3 + 5 = 68,68 % 10 = 8,cd = (10 - 8) % 10 = 2。于是完整 12 位为 036000215182,分组显示 0360 0021 5182。
再验两个来自数据表的样本:前 11 位 12345678901,奇数位 1+3+5+7+9+1=26,偶数位 2+4+6+8+0=20,S=26×3+20=98,98%10=8,cd=(10-8)%10=2,得 123456789012;前 11 位 79000000001,奇数位 7+0+0+0+0+1=8,偶数位 9+0+0+0+0=9,S=8×3+9=33,33%10=3,cd=(10-3)%10=7,得 790000000017。三个样本校验位分别是 2、2、7,与数据表一致。
表格里每一行的校验位都不是写死在页面里的答案,而是把那一行的前 11 位代入同一条加权模 10 公式现算出来的;你清空种子框换成别的数字,整批条码会立刻按新种子重新生成,校验位随之重算。
对照表
对照表用固定种子生成 18 组 UPC-A,默认显示前 12 行,点「加载更多」展开剩余 6 行。每行给出 11 位前缀、末位校验位、以及完整 12 位(每 4 位分组)。举几组读数:第 1 行前缀 62010648310、校验位 3、完整 6201 0648 3103;第 6 行前缀 56359261732、校验位 7、完整 5635 9261 7327;第 12 行前缀 84936796980、校验位 9、完整 8493 6796 9809。
表格数据与上方结果区来自同一套生成逻辑:结果区按「生成数量」取前若干条,表格则固定展示 18 条供对照。导出与复制都取自同一份数组,不会漏掉屏幕上未展开的行。
与结果区的关系是:结果区回答「我这次要的 N 条条码是什么」,对照表回答「固定种子下整批 18 条长什么样」,两者独立但同源。
结果边界与舍入
- 校验位不是防伪。UPC-A 校验位只能拦住「单 bit/单数字错误」和「相邻换位」这类录入差错,故意改几位再凑对校验位完全可行;本页生成的条码格式合法,却不绑定任何真实商品,不能用于实际结算或贴真实货品。
- 首位数字的类别含义忽略。真实 UPC 首位代表商品类别,但本页随机生成默认 0 到 9 任取,不做类别校验,因为只是格式演示,不需要对应真实厂商前缀。
- 数量与种子量程。数量限制 1 到 100,种子为正整数;填 0、负数、非数字、超 2147483647,或数量超 100,都会给出对应报错并停止生成,不会静默归零或截断。
- 分组只是显示。「每 4 位分组」纯粹是印刷样式的空格,不改变数字本身;复制结果时如果勾选了分组,复制到的也是带空格的版本,需要连续串时请取消勾选再复制。
- 末位恰为 0 的情况。当加权和正好是 10 的倍数时校验位为 0(如第 10 行 46909528719 → 校验位 0),这是合法值,不是缺位,页面会如实显示 0。
- 不联网。取随机、算校验、生成表格与复制全部在当前浏览器里完成,不发起网络请求,也不写 Cookie 或本地存储;刷新页面后不留存任何已生成的条码。
常见问题
生成的条码能直接贴到真实商品上卖吗?
不能。本页只保证数字串结构合法、校验位正确,但前 11 位里并不包含真实有效的 GS1 厂商前缀,也不对应任何真实在售商品。把随机条码贴到真实货品上会导致结算、库存与扫码全部错位。本页明确定位是格式与校验的演示和测试工具,仅供学习、占位和回归测试使用。
为什么同一个种子每次都生成一样的条码?
这正是固定种子的设计目的。本页用线性同余公式 s = (Math.imul(s, 1103515245) + 12345) & 0x7fffffff 产生伪随机序列,给定同一个初始种子,每次推进得到的数字序列完全一致,于是前 11 位前缀和末位校验位都一模一样。好处是可以复现、可以对照、可以写进测试脚本做回归比对。
校验位公式里的奇数位、偶数位怎么编号?
从左往右数,第 1 位是奇数位、第 2 位是偶数位,依此类推到第 11 位(奇数位)。UPC-A 规定奇数位权重为 3、偶数位权重为 1,所以校验和是「奇数位数字之和 × 3 + 偶数位数字之和」。注意和日常口语里「第几个数字」一致,不要从 0 开始编号,否则会差一位、校验位整错。
校验位是 0 是不是出错了?
不是。当奇数位和乘 3 加偶数位和正好能被 10 整除时,(10 - 0) % 10 = 0,校验位就是 0。这是完全合法的 UPC-A 末位,页面会如实显示 0,而不是当成空或报错。例如默认对照表第 10 行前缀 46909528719 的校验位就是 0。
分组显示会不会改变条码本身?
不会。每 4 位加空格只是把 12 位数字 036000215182 显示成 0360 0021 5182,数字串本身不变。但复制结果时,复制到的就是当前看到的文本:勾选分组会复制到带空格的版本,取消勾选才复制到连续数字串,喂给条码软件前请确认你要的是哪一种。
数量和种子都留空会怎样?
数量留空时按默认 10 处理,种子留空时按默认 20261108 处理,页面打开即带这组非空示例。只有当你填了非法值(如数量 0、种子为负数或非数字)才会触发具体报错并停止生成,不会把坏输入悄悄当成 0。
校验位能防住故意篡改吗?
防不住。加权模 10 只针对「偶然录入错误」设计,知道算法的人完全可以任意改几位再反向算出能通过校验的末位。所以 UPC-A 校验位解决的是扫描录入的可靠性,不是商品的真实性与防伪;本页生成的条码也同样不具备防伪含义。
生成的条码会被上传或保存吗?
不会。从取随机、算校验到生成表格和复制到剪贴板,整条链路都在浏览器本地完成,不发起任何网络请求,也不写 Cookie 或 localStorage。关掉页面后,当前这批条码不会留存,下次打开仍是默认示例。