String to Number和back算法

时间:2010-10-05 13:43:04

标签: algorithm string numbers formula

这对我来说很难(我)我希望人们可以帮助我。我有一些文字,我需要将它转移到一个数字,但它必须是唯一的,就像文本是唯一的一样。

例如: 'kitty'这个词可以产生12432,但只有kitty这个词产生了这个数字。文本可以是任何内容,应该给出适当的数字。

结果整数必须是一个32位无符号整数的一个问题,这意味着最大可能的数字是2147483647.我不介意是否有文本长度限制,但我希望它可以尽可能大。


我的尝试。你有字母A-Z和0-9所以一个字符可以有1-36之间的数字。但是如果A = 1且B = 2并且文本是A(1)B(2)并且你添加它你将得到3的结果,问题是文本BA产生相同的结果,所以这个算法不会工作

有什么想法指出我正确的方向还是不可能做到?

5 个答案:

答案 0 :(得分:5)

你的想法通常是理智的,只需要开发一点。

f(c)成为将字符c转换为范围[0..M-1]中的唯一数字的函数。然后你可以像这样计算整个字符串的结果数。

f(s[0]) + f(s[1])*M + f(s[2])*M^2 + ... + f(s[n])*M^n

您可以轻松证明该号码对于特定字符串是唯一的(您可以从该号码中获取字符串)。

显然,你不能在这里使用很长的字符串(对于你的情况最多6个字符),因为36^n增长很快。

答案 1 :(得分:0)

用映射到唯一数字的单词构建字典并使用它,这是你能做的最好的。

我怀疑使用的字数超过2 ^ 32,但这不是您面临的问题,问题是您需要将数字映射回字。

如果你只是将单词映射到数字,那么一些散列算法可能会起作用,尽管你需要稍微努力以保证你有一个不会产生冲突。

然而,对于数字回到单词,这是一个非常不同的问题,最简单的解决方案就是建立一个字典并映射两种方式。

换句话说:

AARDUANI = 0
AARDVARK = 1
...

如果您想将数字映射到26个字符,那么您只能存储6个字符(如果我计算错误,则只能存储5个或7个字符),但不能存储12个字符,当然不能存储20个字符。

除非你只计算实际的单词,否则他们不遵循任何好的可数规则。唯一的方法是将所有单词放在长列表中,然后从头开始分配数字。

答案 2 :(得分:0)

想象一下,你试图只在一个数字中存储字符集“0-9”中的字符串(相当于获得一串数字)。你会做什么?

Char 9 8 7 6 5 4 3 2 1 0
Str  0 5 2 1 2 5 4 1 2 6

Num = 6 * 10^0 + 2 * 10^1 + 1 * 10^2...

对你的角色应用相同的东西。

Char 5 4 3 2 1 0 
Str  A B C D E F
L = 36

C(I): transforms character to number: C(0)=0, C(A)=10, C(B)=11, ...

Num = C(F) * L ^ 0 + C(E) * L ^ 1 + ...

答案 3 :(得分:0)

如果用某种语言拼写正确的文字,你可以为每个单词加上一个数字。但是,您需要考虑所有可能的复数,地点和人名等,这通常是不可能的。我们在谈论什么样的文字?在没有事先了解的情况下,通常会有一些现有的单词无法以任何方式编码为32位。

你可以建立一个单词列表吗?只需给出第一个单词,您可以看到数字1,第二个数字2,并检查单词是否已有数字或者是否需要新单词。然后在某处保存新创建的字典。如果你需要100%可靠的,可逆的映射,从数字回到原始单词给出新的未知文本,这可能是唯一可行的解​​决方案。

使用64位和足够好的散列(如MD5),它极不可能发生冲突,但对于32位,似乎不太可能存在安全散列。

答案 4 :(得分:0)

只需将每个字符视为基数为36的数字,并计算十进制等值数?

所以:

'A' = 0
'B' = 1
[...]
'Z' = 25
'0' = 26
[...]
'9' = 35
'AA' = 36
'AB' = 37
[...]
'CAB' = 46657