2012-12-12 88 views
-1

我有一个数据库表,每行都有其唯一的标识(RowID)。将唯一编号映射到6个字符的唯一字符串

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

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

我已经想了很多关于这个,但我不能想出一个算法,能够正确地做到这一点。

我有一个想法是: 唯一键= ROWID 如果ROWID是比100000低则在它的前面附加0,例如: 123变为00 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个独特的密钥。

任何反馈将如何这可能是正确完成(甚至是最优的):-)

谢谢理解!

+2

难道你不是在寻找一种方法将一个数字转换为它的base-62表示吗? –

+0

这是正确的,那就是诀窍。谢谢! – raRaRa

回答

1

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

+0

好点。如果数字的编码值小于6个字符,我会安全地在其前面添加一些字符吗? – raRaRa

+0

无论您选择哪个数字基地,它都会有一个零...如果您需要固定长度,您可以在左侧填充零。如果您使用的是普通数据库,那么在使用可变长度列(varchar)时不会保存,因此您也可以使用它。 – user1666959

1

您可以对您的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 ...)
[编辑:基本上与base-62建议的相同@HighPerformanceMark评论]


第一种方法的优点:可以让你应付高达62^6个号码,无论他们尺寸,而第二种方法不允许这样做。

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

+0

感谢您的好评。事实上,将行ID转换为base62的技巧:-) – raRaRa

0

有很多方法可以做到这一点 - 挑战是选择一个“最好”的任何标准。一些例子,但远没有穷尽的(一些已经在其他地方的建议):

  • 垫递增顺序
  • 基地-62表示(注:基64是常用的,可能甚至已经拥有代码它在你手头的任何库中)
  • 截断加密哈希(很慢,但有一些其他属性可能是有用的,具体取决于你为什么需要这样做;如果你只需要做一次,性能命中可能是值得的)
  • 其他不一定加密哈希函数,可能会相当快
  • ......
相关问题