我有一个数据库表,其中每一行都有唯一的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个唯一键。
如果能够正确地(甚至是最佳地)完成任何反馈,我们将不胜感激:-)
谢谢!
答案 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)
有很多方法可以做到这一点 - 挑战是挑选一个“最好”的方法,无论你的标准是什么。一些例子,但远非详尽无遗(一些已经在其他地方提出过):