首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用内置签和创建一个唯一的id?

使用内置签和创建一个唯一的id?
EN

Stack Overflow用户
提问于 2012-02-02 19:59:11
回答 4查看 8.2K关注 0票数 5

我想要自动生成一个独特的8-10字符ID字符串,其中包含某种校验和位,以防止在数据输入时出现错误。我更喜欢没有序号的东西,在这种情况下,输入数据的人最终会陷入“常规”状态,并且习惯于一直输入相同的序列。

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

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

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

第二次更新 OK,我不明白这是什么让人困惑的,但我将尝试进一步解释。我试图创建跟踪号码,将在表格上,将填写和数据-在稍后的时间输入。我将生成id并将其打在表单上;id必须是唯一的,它需要支持大量的数字,并且需要对数据输入进行合理的白痴验证。

我不知道这件事是否已经做过,也不知道是否能做到,但问一问也没什么坏处。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-02 20:03:30

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

  • ID需要是“不可猜测的”吗?如果是的话,就应该混合一些散列。
  • ID是否需要是“安全的”(例如激活密钥或其他什么的)?如果是的话,那么某种公钥密码体制就应该混合在一起。
  • ID /校验和计算是否需要快速?如果是,那么也许一些非常简单的算法,如CRC32或Luhn (信用卡校验和算法)或soem条形码校验和算法是值得一看的。
  • ID生成是否集中?如果没有,您可能需要查看GUID、当前时间、MAC地址和类似的内容。

更新-根据注释:

  • 在DB中使用序列
  • 接受该值并对其进行散列,例如使用MD5
  • 取最不重要的40-48位哈希。
  • 将其编码为Base-36 (0-9和as ),给你8-10“数字”(字母数字)
  • 检查结果与DB,并放弃如果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多项式来修改此代码.

票数 6
EN

Stack Overflow用户

发布于 2012-02-02 20:05:02

您可能会模仿航空公司的预订系统:它们使用as和0-9作为字符,将一个数字转换为基-36。因此,它们的上限是36^6。

如果您需要保证唯一性,并且不希望它们是连续的,则必须将已使用的随机数保存在某个表中。

在您有了随机或伪随机ID之后,只需计算您的校验位数。

使用CRC算法。它们可以适应任何需要的长度(在您的情况下,6位)。

编辑

如果不清楚:即使使用alpha代码,在生成校验数字之前,也必须将其转换为数字。

编辑

  1. 校验和验证不是重量级的,它可以在javascript中实现客户端。
  2. 一个六个字符的字母数字(即航空记录定位器)= 10八进制数。那就够了?(确切结果请参见沃尔夫拉姆阿尔法。)
票数 4
EN

Stack Overflow用户

发布于 2012-02-02 20:02:26

大多数信用卡使用Luhn算法 (也称为mod10算法)校验和算法来验证卡号。维基百科:

Luhn算法将检测任何一位数字的错误,以及几乎所有相邻数字的转换。然而,它不会检测到两位数序列09到90的转位(反之亦然)。

该算法是通用的,可以应用于任何识别号码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9119070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档