2

将 guid 字符串压缩/编码为较小的字符串表示形式,然后将其解码回 guid 的任何简单算法。任何可用的 JavaScript 代码。

例如。0a0a8907-40b9-4e81-8c4d-d01af26efb78 使用 36 个字符。我可以减少到大约 20-24 个字符的字符串表示...

4

3 回答 3

2

我找到了一个能够将 HEX 转换为 BASE64 和向后的库。您基本上需要从 GUID 中删除每个连字符并对其进行编码:

var guid = "0a0a8907-40b9-4e81-8c4d-d01af26efb78";
var encoded = guid.replace(/-/g, "");
encoded = hexToBase64(encoded);

然后接收端可以对其进行解码并将其重新组合在一起:

var chunks = [];
chunks.push( decoded.substring(0, 8) );
chunks.push( decoded.substring(8, 12) );
chunks.push( decoded.substring(12, 16) );
chunks.push( decoded.substring(16, 20) );
chunks.push( decoded.substring(20) );
decoded = chunks.join("-");

您的示例 GUID 的编码版本是CgqJB0C5ToGMTdAa8m77eA==24 个字符长。

查看此小提琴以获取工作示例。

于 2013-07-01T17:57:55.730 回答
1

这是一个不需要外部库并将数据存储在 12-24 个实际字节中的简单例程:

function encode(s){
  return s.split("-").map(function(a,b,c){ 
   return a.split(/(\w{4})/).filter(Boolean).map(function(aa,bb,cc){
               return  String.fromCharCode(parseInt(aa, 16))
          }).join("");
  }).join("|");
}


function decode(s){
  return s.split("|").map(function(a){     
     return a.split("").map(function(aa){return String("0"+aa.charCodeAt(0).toString(16)).slice(-4) }).join("")
  }).join("-");
}



var guid = "0a0a8907-40b9-4e81-8c4d-d01af26efb78"; //36 chars
var encoded=encode(guid); //=== "ਊ複|䂹|亁|豍|퀚ﭸ"
var guid2=decode(encoded);

alert([guid, guid2, encoded].join("\n"));

/* shows:
 0a0a8907-40b9-4e81-8c4d-d01af26efb78
 0a0a8907-40b9-4e81-8c4d-d01af26efb78
 ਊ複|䂹|亁|豍|퀚ﭸ
 12b
*/

这很好地利用了 localStorage,因为它可以存储未编码的宽字符。如果你必须突破到 ascii,那么你就是在浪费时间和空间来处理这个例程......

于 2013-07-01T21:34:13.493 回答
0

将十六进制值转换为 32 位块中的整数,然后使用 base 64 重新编码生成的字符串。

于 2013-07-01T17:30:45.603 回答