有没有办法将长度超过25个字符的字符串存储到一个短于25个字符的十六进制字符串中并使其可逆?

时间:2009-07-02 14:31:48

标签: algorithm encoding compression

很抱歉,如果标题没有意义。基本上我有一系列长度为10-60个字符的字符串。问题是我必须使用的服务只接受最多25个字符串,所以我需要一种方法将我拥有的字符串转换为25个字符或更少,发送它然后当我得到结果返回时能够将其转换回原来的身份。

实施例

id =  "this_is_a_test_account_that_is_longer_than_allowed"
id = contract(id)
// id = "DSFK23478JDSFHGW874"
id = expand("DSFK23478JDSFHGW874")
// id = "this_is_a_test_account_that_is_longer_than_allowed"

9 个答案:

答案 0 :(得分:12)

不,你不能这样做。它基本上要求一种压缩算法,它将总是使事情变得更小 - 它不会发生。至少不是一般意义上的,由于pigeonhole principle。 (特别是,考虑一下正确长度的每个十六进制字符串。你必须存储所有这些,所以假设每个都只是自己。现在,你必须能够存储其他字符串 - 但根据定义,你的有效输出已经用完了。)

另一方面,如果您的服务器可以为任何字符串生成UUID并存储该字符串,那么您可以稍后再次查看该UUID。那对你的情况有用吗? (当然它不一定是一个UUID - 你可以从0开始,然后继续努力......)

如果您事先知道所有字符串,那只是这种情况的一个特例:为所有字符串创建一个硬编码的双向映射,以某种方式唯一地生成输出(例如,使用UUID)。

答案 1 :(得分:1)

如果字符串的字符仅限于少数字符,则可以使用“禁用字符”进行压缩以进行压缩。但我相信它不如将60个字符压缩成25个字符那么好......

答案 2 :(得分:0)

抱歉,您可能需要做一些奇特的事情或更改服务。 它可以像将任意大的字符串存储到一个简单的表中一样简单,在该表中使用一个标识字段,这是您发送给服务以将完整的字符串拉回来的。

答案 3 :(得分:0)

真的,Jon的回答是一个补充。在一般情况下(任何10-60个字符串),这是不可能的。

但是,如果您的原始ID具有众所周知的特征 - 即您只使用字符0到9 - 则可能。但是我们没有足够的信息来帮助你。

答案 4 :(得分:0)

在一般情况下你不能这样做 - 总是让字符串变小需要不可能的压缩。但是,我可以看到两个选项:

首先,只需将密钥存储在地图中:

shared state: map
contract(id) {
  key = generateNewUniqueShortString();
  map.put(key, id);
  return key;
}
expand(key) {
  return map.remove(key);
}

这需要一些共享存储,但可能正常工作。

如果您对字符串有所了解(例如,您只使用A-Za-z0-9_,则可以使用查找表来减小大小。这意味着每个字符只需要6位,而在Java中每个字符有16位。使用某种基于频率的霍夫曼编码会更好,但不能保证。

答案 5 :(得分:0)

看起来您的输入字符集是小写字母加下划线(27个字符)。如果源输入中只有16个字符,则可以将两个字符放入一个字节中。

如果您要使用双字节字符格式,则可以轻松执行此操作。如果您要使用单字节字符格式,我认为您不能。

如何将字符串分成三个较小的字符串并使用该服务三次?

答案 6 :(得分:0)

这在很大程度上取决于这些字符串的内容。例如,如果您知道输入字符串始终仅由字母az(26),AZ(26)和数字0-9(10)组成,那么您可以放心,每个字符长字符串是62种可能的东西之一,可以很容易地用较少的位存储(在这种情况下为6)。假设您使用的服务对一个字符使用八位,这可以使您的长度减少25%。如果输入字符串使用较少的字符,或者服务接受每个字符超过8位,那么您可以改进足够的内容以便使用。

答案 7 :(得分:0)

如果转换后的字符串只是暂时使用,那么让我们说发送一个请求并获得一个响应,然后你可以使用一些函数获得一个“瞬态唯一”max 25 char字符串并将映射存储到你的原始id 。使用瞬态ID后,您可以将其丢弃。对于每个请求,您可以根据需要创建新请求。您只需确保在使用这些ID的范围内不会出现重复映射。 (类似于Nick Fortescues的第一个例子。)

答案 8 :(得分:0)

压缩不会让你从你到达你需要的地方。我认为有三种方法可以解决您的问题......取决于帐户和服务的详细信息。

1)为帐户分配一个符合25个字符限制的备用ID。将现有ID视为“描述”而不是服务的密钥。这要求您可以生成某种哈希并将其可靠地存储在服务之外,或者该服务还将存储10到60个字符之间的“描述”。

2)将ID分成三部分,并使用该服务将每个ID存储在单独的20个字符ID中。使用剩余的5个字符为每个部分分配某种独特的签名...允许您检索所有三个部分并重新组合ID。根据服务,这可能是不合需要的(例如,它可能为单个实例创建三个完整记录)。

3)更改服务或查找允许ID最多60个字符的新服务。