将唯一编号映射到6个字符的唯一字符串

时间:2012-12-12 15:10:41

标签: string algorithm numbers unique-key

我有一个数据库表,其中每一行都有唯一的ID(RowID)。

是否有一种很好的方法可以将此RowID转换为长度始终为6个字符的唯一键。唯一的关键字符可以是{A-Za-z0-9}。唯一键的一个例子是:a5Fg3A。

当然我确实知道使用这种方法只能生成一定数量的密钥,但这对我的情况无关紧要。

我已经考虑过很多,但我无法想出能够正确执行此操作的算法。

我的一个想法是: 唯一键= RowID 如果RowID低于100000,则在其前面追加0,例如: 123变成000123 1变为000001

然后,对于100000到900000范围内的数字,我会将第一个数字替换为字符串,例如0 = a,1 = b,2 = c,...,9 = j。

然后我可以用大写字母等来做同样的事情。

我的问题是我的算法非常有限并且生成的键数量很少,因为它不会使用所有可能的字符。

所以基本上我应该能够生成56800235584个唯一键,假设每个键长度为6并使用这些字符:{A-Za-z0-9}。

A-Z = 26个字符 a-z = 26个字符 0-9 = 10个字符

所以它是62 ^ 6个唯一键。

如果能够正确地(甚至是最佳地)完成任何反馈,我们将不胜感激:-)

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以对ID进行排序,然后为每个ID添加不断增加的词典字符串。

您的字母仅为{a,b}(仅为了简单起见)和Ids= [20,1,7,90]的简单示例:

sort: Ids = [1,7,20,90]
Attach increasing strings:
1 =  aaaaaa
7 =  aaaaab
20 = aaaaba
90 = 0000bb

如果你想把它作为某种哈希函数,而不是数据依赖 - 你可以使用与数字相同的二进制编码,并将其转换为相似(即1 = aaaaaa,2 = aaaaab,3 = aaaaac ......)
[编辑:与评论中@HighPerformanceMark建议的base-62基本相同]


第一种方法的优点:允许您处理多达62 ^ 6个数字,无论其大小如何,而第二种方法不允许它。

然而,第二种方法允许您从数字到字符串的一致转换,无论具体数据如何。

答案 1 :(得分:1)

如果你想让A-Z a-z 0-9成为字母,你注意到你有62号基数系统。因此,在base 62中编码唯一的rowid,有一个标准的算法可以做到这一点。如果您的应用程序允许(需要)它,您可以添加一些可打印的字符,如'+','/','!','@'..这样您就可以获得更多的独特性。现成的答案是base64编码,广泛使用。

答案 2 :(得分:0)

有很多方法可以做到这一点 - 挑战是挑选一个“最好”的方法,无论你的标准是什么。一些例子,但远非详尽无遗(一些已经在其他地方提出过):

  • 按顺序递增
  • base-62表示(注意:base-64是常用的,甚至可能已经在你手头的任何库中都有代码可用)
  • 截断的加密哈希(慢,但有一些其他可能有用的属性,具体取决于你需要这样做的原因;如果你只需要做一次,性能命中可能是值得的)。
  • 其他不一定加密的哈希函数可能会快得多
  • ......