-1

我有一个数据库表,其中每一行都有其唯一 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}。

AZ = 26 个字符 az = 26 个字符 0-9 = 10 个字符

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

任何关于如何正确完成(甚至最佳)的反馈都将不胜感激:-)

谢谢!

4

3 回答 3

2

您可以对 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 = aaaaaab,3 = aaaaac。 ..)
[编辑:与@HighPerformanceMark 在评论中建议的 base-62 基本相同]


第一种方法的优点:允许您处理多达 62^6 个数字,不管它们的大小是多少,而第二种方法不允许。

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

于 2012-12-12T15:13:52.840 回答
1

如果您想让 AZ az 0-9 成为您注意到的字母表,那么您有 62 个基数系统。所以用base 62编码唯一的rowid,有一个标准的算法可以这样做。如果您的应用程序允许(需要)它,您可以添加更多可打印字符,例如“+”、“/”、“!”、“@”……这样您就可以获得更多的独特性。现成的答案是广泛使用的base64编码。

于 2012-12-12T15:21:12.930 回答
0

有很多方法可以做到这一点 - 挑战是根据您的标准选择“最佳”的方法。一些例子,但远非详尽(一些已经在其他地方提出过):

  • 用递增序列填充
  • base-62 表示(注意:base-64 是常用的,甚至可能已经在您手头的任何库中提供了可用的代码)
  • 截断加密哈希(速度慢,但有一些其他可能有用的属性,具体取决于您需要这样做的确切原因;如果您只需要这样做一次,那么性能损失可能是值得的)
  • 其他不必要的加密哈希函数,可能会快得多
  • ……
于 2012-12-12T15:24:28.227 回答