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



要求:

我们在数据库中有类似的值

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

等等。。。

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

Chennai –> xy67kr
San Jose –> iuj73d

基本上类似于URL shortner。

转换这个的算法应该是可逆的。。即,当我将"xy67kr"传递给解码函数时,它应该会返回"Chennai"。

期待帮助。

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

一个示例方法是计算集合中的字符频率,然后用前缀码对字符进行编码,使最频繁的字母用短前缀进行编码(即霍夫曼编码)

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

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

查看我对类似问题的回答,然后将其重写为PHP:

编码:

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

解码:

$decoded = gzinflate(base64_decode($encoded))

注意,gzdeflate在短字符串上的性能优于gzcompress

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

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

您可以做的是为数据库中该特定字符串的行的唯一ID创建这些短字符串。这里有一些提示:如何设计一个类似序列散列的函数。

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

最新更新