存储GUID的最高效线性条形码

28
我目前正在开发一个系统,需要用户登录系统,客户希望使用条码扫描器和卡片来降低成本。(是的,用户名和密码更便宜,但她想要一种卡片解决方案,所以她选择了这个。)
我的所有数据都使用GUID作为关键字段,所以我希望直接将GUID存储在条码上的卡片中。虽然将其编码为3 of 9很简单,但这不会是最有效利用空间的方法。
是否有一种最佳实践或最有效的方法来存储GUID在条码中?我原以为由于数据具有一致的长度和深度,应该有一个标准,但我找不到。生成自己的方法很容易-在两端加入控制字符,然后在之间添加二进制数据,但我希望能够使用标准读取器解释的内容。
非常感谢任何帮助。

你为什么不能简单地添加另一个表,将数字条形码映射到GUID呢? 这样,如果卡被破坏,您可以轻松地重新发行带有新数字映射到相同GUID的条形码,而不必更改许多相关记录。 添加一个过期日期列,您还可以在一段时间后(例如每年)注销卡。 - Ian Mercer
嗨,伊恩。我在考虑直接存储GUID作为关键字段并创建聚集索引。结果我几乎使用了你的解决方案。每个用户都有一个ID号码,我最终将其编码到条形码中,并在其上创建了一个非聚集索引。基本上就是你在这里建议的。非常感谢。 - Matthew Baker
1个回答

39

目前并没有针对通用线性条形码(如Code 39和Code 128)的特殊数据压缩的开放标准。大多数ISO/IEC标准化的二维码都支持一种名为“扩展通道解释”(ECI)的特殊数据编码机制,该机制允许您指定数据符合某个应用程序标准或编码方案,例如用于IPv4地址压缩的ECI 298765 [*]。不幸的是,GUID压缩并未在已注册的编码方案中,即使有也需要在应用程序中处理,因为读取器的支持缺失。

这意味着您必须将GUID预先编码(然后解码),以便使用一些普遍的条形码符号可以有效地处理它。

一种存储GUID的高效方式是将其转换为40位小数[†]表示,并使用双密度数字压缩(“C模式”)将结果存储在Code 128条形码中。

例如,考虑以下GUID:

cd171f7c-560d-4a62-8d65-16b87419a58c

以十六进制数表示:

0xCD171F7C560D4A628D6516B87419A58C

转换为40位十进制数:

0272611800569275698104677545117639878028

在 Code 128 条形码中编码:

用十进制编码的 GUID 在 Code 128 条形码中

当然,您的应用程序需要将此输入识别为十进制编码的 GUID,并反转上述过程,但我怀疑除了将数据转换为不寻常的基数并在扫描时处理 ASCII 控制字符的复杂性之外,不存在更有效的方法。

[*] 指定的 ECI 代码注册表可从 AIM 商店获取,网址:"ECI 第三部分:注册"

[†] 虽然可以将整个 GUID 范围存储在 39 位数字中,但 39 位数字的 Code 128 符号实际上比 40 位符号更长。


嗨,特里。感谢回复。你的答案基本上就是我自己研究后找到的结果。不过我已经习惯了这样的方法,即如果找不到答案,那就问一下吧。毕竟发现自己在错误的方法上花费了六个月时间,而其他所有事情都围绕它展开,这种情况还是很糟糕的。我暂时不会将其标记为答案,希望能够在别处找到答案。如果一周左右我仍然没有找到答案,我会将其标记为答案的。 - Matthew Baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接