Algorithm 为应该是可逆的字符串生成唯一(常量)代码的算法

Algorithm 为应该是可逆的字符串生成唯一(常量)代码的算法,algorithm,url-shortener,Algorithm,Url Shortener,要求: 我们有类似DB的值 Chennai Baroda Bangalore New Delhi São Paulo, Lisboa San Jose 等等 所以我想把这些字符串转换成一个唯一的短字符串。比如说 Chennai –> xy67kr San Jose –> iuj73d 基本上类似于URL shortner 转换的算法应该是可逆的。。i、 e当我将“xy67kr”传递给解码函数时,它应该会返回“钦奈” 期待帮助。查看类似问题,然后将其改写为PHP: 编码: $en

要求:

我们有类似DB的值

Chennai
Baroda
Bangalore
New Delhi
São Paulo, Lisboa
San Jose
等等

所以我想把这些字符串转换成一个唯一的短字符串。比如说

Chennai –> xy67kr

San Jose –> iuj73d
基本上类似于URL shortner

转换的算法应该是可逆的。。i、 e当我将“xy67kr”传递给解码函数时,它应该会返回“钦奈”

期待帮助。

查看类似问题,然后将其改写为PHP:

编码:

$encoded = base64_encode(gzdeflate("São Paulo, Lisboa"))
解码:

$decoded = gzinflate(base64_decode($encoded))
请注意,
gzdeflate
在短字符串上的性能优于
gzcompress


但无论如何,这个问题是,对于短字符串,它会使字符串变长。这在较长的文本上表现更好当然最好使用一些带有先验信息的压缩算法,比如ppm或带有初始后缀树的后缀方法。。。然后,它也可以完美地处理短字符串。

不能将任意长度的字符串缩短为固定长度的字符串


您可以做的是为数据库中该特定字符串行的唯一ID创建这些短字符串。这里有一些提示:。

正如其他海报所说,你不能有一个缩短任意字符串的函数,这在数学上是不可能的。但是您可以创建一个自定义函数,该函数可以很好地处理特定的字符串集

一种示例方法是计算集合中的字符频率,然后仅使用a对字符进行编码,以便使用短前缀(即…)对最频繁的字母进行编码

上述方法没有利用以下事实:在自然语言中,下一个字符可以从以前的字符中非常准确地预测出来,因此您可以扩展上述算法,以便不单独编码字符,而是将下一个字符编码为n-gram。当然,这需要一个比简单方法更大的压缩表,因为根据前缀,您实际上有一个单独的代码。例如,如果“e”在“th”之后非常频繁,那么“th”之后的“e”将使用非常短的前缀进行编码。如果“e”在“ee”之后非常不频繁,那么在这种情况下可以使用很长的前缀对其进行编码。解码算法显然需要查看当前解压缩的前缀,以检查如何解码下一个字符


这种通用方法假设频率不会改变,或者至少变化缓慢。如果数据集发生更改,则可能需要重新计算统计信息并重新编码字符串。

这不一定是确定的,但显然可以使用查找表。该服务将类似于goo.gl或imgur

字符串是否需要固定长度?如果您有一个数据库,那么反转的处理应该非常简单…@taher:没有任何函数可以以可以反转的方式缩短任意字符串(由于存在错误)。除非你能对输入字符串的值进行严格的约束,否则你必须使用某种查找机制。我不明白。。你在DB中有它,但你不想使用DB?@taher:但是这个算法不存在……当然最好使用一些带有先验信息的压缩算法,比如ppm或带有初始后缀树的后缀方法。。。那么它在短弦上也能完美地工作。但问题是,这些方法是否可以在PHP中访问,我怀疑这是否适用于短输入数据。OP似乎还需要固定长度的编码,这显然是不可能的。@OliCharlesworth相反,这种统计编码即使对单个字符串也能很好地工作,除了这样一个事实,即即使生成的代码是6位,那么您仍然必须发送(或保存)至少一个字节。我同意固定长度编码是不可能的。好吧,在我最初的问题中,我问我的输入字符串可以是可变长度的。因此,假设我通过应用填充使它们具有固定的长度,即-->纽约[变成]-->纽约!@!!@!或者类似的。那么编码后是否可以缩短它们?@taher Oli指的是编码后字符串的长度。鸽子洞原理指出,确保最终字符串是固定的唯一方法是限制输入字符串集(使其大小不大于固定长度字符串的数量)。唯一可行的方法是使用DB,就像URL缩短器一样。在没有数据库的情况下,最好使用针对数据调整的压缩算法。这可以实现非常好的压缩-虽然没有固定大小的输出。谢谢各位,我已经得到了我的答案。