要求:
我们在DB中有值
Chennai
Baroda
Bangalore
New Delhi
São Paulo, Lisboa
San Jose
等等...
所以我想将这些字符串转换为唯一的短字符串。例如
Chennai –> xy67kr
San Jose –> iuj73d
基本上类似于URL shortner。
并且转换它的算法应该是可逆的。即当我将“xy67kr”传递给解码函数时它应该给我“Chennai”。
期待着寻求帮助。
要求:
我们在DB中有值
Chennai
Baroda
Bangalore
New Delhi
São Paulo, Lisboa
San Jose
等等...
所以我想将这些字符串转换为唯一的短字符串。例如
Chennai –> xy67kr
San Jose –> iuj73d
基本上类似于URL shortner。
并且转换它的算法应该是可逆的。即当我将“xy67kr”传递给解码函数时它应该给我“Chennai”。
期待着寻求帮助。
正如其他海报所述,你不可能有一个缩短任意字符串的功能,这在数学上是不可能的。但是您可以创建一个适合您特定字符串集的自定义函数。
一个示例方法是计算集合中的字符频率,然后用a编码字符 前缀代码 这样,最常用的字母用短前缀编码(即 霍夫曼编码。)
上面的方法没有利用这样的事实:在自然语言中,下一个字符可以从之前的字符中进行相当准确的预测,因此您可以扩展上述算法,以便不是单独编码字符,而是编码n中的下一个字符。 -公克。这当然需要比简单方法更大的压缩表,因为根据前缀,您实际上有一个单独的代码。例如,如果'e'在'th'之后非常频繁,那么'th'之后的'e'用非常短的前缀编码。如果'e'在'ee'之后非常罕见,那么在这种情况下它可以使用非常长的前缀进行编码。解码算法显然需要查看当前解压缩的前缀以检查如何解码下一个字符。
这种一般方法假设频率不会改变,或至少变化缓慢。如果您的数据集发生了更改,则可能需要重新计算统计信息并重新编码字符串。
看到 我的答案 类似的问题,只需将其重写为PHP:
编码方式:
$encoded = base64_encode(gzdeflate("São Paulo, Lisboa"))
解码:
$decoded = gzinflate(base64_decode($encoded))
注意 gzdeflate
表现要好于 gzcompress
在短串。
但无论如何,问题在于,对于短字符串,它会使字符串更长。这在较长的文本上表现更好。 当然最好使用一些具有先验信息的压缩算法,如ppm或带有初始后缀树的后缀方法......那么它也可以在短字符串上完美地工作。
您不能将任意长度的字符串缩短为固定长度的字符串。
你可以做的是创建那些短字符串 唯一身份 数据库中该特定字符串的行。以下是一些提示: 如何设计顺序类似哈希的函数。
这不一定是确定性的,但显然你可以使用查找表。该服务类似于goo.gl或imgur