创建一个带有内置校验和的唯一 ID?

Jer*_*acs 5 c# checksum unique

我想自动生成一个唯一的 8-10 个字符 ID 字符串,其中包含某种校验和位,以防止数据输入时出现拼写错误。我更喜欢没有序列号的东西,数据输入人员最终会陷入“陈规”并习惯于始终键入相同的序列。

是否有与此类事情相关的最佳实践/陷阱?

更新:好的,我想我需要提供更多细节。

  1. 我想使用字母数字,而不仅仅是数字
  2. 我想要类似于信用卡校验和的行为,但使用 8-10 个字符而不是 16 位数字
  3. 我想让 id 是唯一的;不应该有碰撞的可能性。

第二次更新好吧,我不明白这有什么令人困惑的,但我会尝试进一步解释。我正在尝试创建将在表格中显示的跟踪号码,该表格将在稍后填写并输入数据。我将生成 id 并将其贴在表单上;id 需要是唯一的,它需要支持很多数字,并且对于数据输入来说它需要具有合理的防白痴功能。

我不知道这是否已经做到了,或者即使可以做到,但问一下也无妨。

Yah*_*hia 7

你的问题非常笼统 - 因此只是一些一般方面:

  • ID 是否需要“不可猜测”?如果是,那么应该混合某种哈希值。

  • ID 是否需要“安全”(例如激活密钥或其他东西)?如果是,那么应该混合使用某种公钥加密技术。

  • ID/校验和计算是否需要很快?如果是,那么也许一些非常简单的算法,如 CRC32 或 Luhn(信用卡校验和算法)或 soem 条形码校验和算法可能值得一看。

  • ID 生成是否集中?如果没有,那么您可能需要检查 GUID、当前时间、MAC 地址和类似的内容。

更新 - 根据评论:

  • 使用数据库中的序列
  • 获取该值并对其进行哈希处理,例如使用 MD5
  • 取该哈希值的最低有效 40-48 位
  • 将其编码为 Base-36(0-9 和 AZ),为您提供 8-10 个“数字”(字母数字)
  • 检查数据库的结果,如果 ID 已经存在则丢弃(对于极少数发生冲突的可能性)
  • 计算 CRC-6-ITU(请参阅第 3 页的http://www.itu.int/rec/T-REC-G.704-199810-I/en
  • 将 CRC 结果附加为最后一个“数字”(也是以 36 为基数)
  • 因此你有一个包含校验和的唯一 ID

要检查输入的值,您只需从除最后一位之外的所有数字重新计算 CRC-6-ITU,并将结果与​​最后一位数字进行比较。

上面的内容相当“难以猜测”,但绝对不是“高度安全”的。

更新 2 - 根据评论:

有关如何在 javascript 中计算 CRC 的一些灵感,请参阅- 它包含 CRC-8 等的 javascript 代码。

您应该能够根据 CRC-6-ITU 多项式调整此代码。