Base64编码的BSON比BSON更小吗?

4
Base64编码的BSON是否比BSON更小?

10
衡量=了解。 - BalusC
3个回答

11

Piskvor是正确的,base64编码后的任何内容都比原始内容长。你使用base64编码将内容传输到字符受限的通道中,而不是为了减小大小。

也许问题应该是:Base64编码的BSON是否比JSON更小?

如果是这样,那么JSON与BSON的比较结果非常依赖于内容。例如,像1.2345678901234567这样的任意浮点数在BSON中以8个二进制字节存储的效率比使用JSON字符串数字版本更高。但是像1这样的更常见的数字在JSON中作为字符串存储时更加高效。

对于字符串值,BSON会因为长度词而损失4个字节,但是对于每个JSON需要转义的"\,以及在包含控制字符的字符串中需要使用十六进制序列的情况下,BSON能够得到一些优势。(某些JSON编码器也会对每个非ASCII字符进行\u转义,以确保在任何字符集下都可以安全传输。)

我认为:总的来说,BSON并没有比JSON具有更大的紧凑性优势。它的优势更多地在于低级语言的解码简单性,以及JavaScript没有的数据类型。它可能在二进制字符串和其他一些情况下略有优势;对于特定工作负载来说,它肯定值得检查。但值得注意的是,BSON规范本身中的示例在JSON中要小得多。

至于base64编码的BSON:情况与此类似,只不过会更糟,长度增加了33%。


稍后我会将Base64编码的BSON与JSON进行比较。谢谢! - Faisal Abid

6

使用base64编码时,每3个字节的明文会被编码成4个字节的密文,因此无论数据负载是什么,结果始终会更大。详情请参见:http://en.wikipedia.org/wiki/Base64


1

我刚刚写了这个缩短BSON的解决方案,请检查一下,它可能会对你有所帮助:

var bsonShortify = {
  encode:function(bson){
    return this._hex2urlBase(bson.substr(0,bson.length/2))+this._hex2urlBase(bson.substr(bson.length/2,bson.length/2));
  },
  decode:function(token){
    return this._urlBase2hex(token.substr(0,token.length/2))+this._urlBase2hex(token.substr(token.length/2,token.length/2));
  },
  _base:62,
  _baseChars:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
  _urlBase2hex:function(token){
    var s = 0, n, l = (n = token.split("")).length, i = 0;
    while(l--) s += this._baseChars.indexOf(n[i++]) * Math.pow(this._base, l);
    return s.toString(16);
  },
  _hex2urlBase:function(bson){
    var s = "", n = parseInt(bson,16);
    while(n) s = this._baseChars[n % this._base] + s, n = Math.floor(n / this._base);
    return s;
  } 
}

测试

//we have bson
var bson = '4f907f7e53a58f4313000028';
//let's encode it
var urlstring = bsonShortify.encode(bson) // = OqAYQdCHijCDMbRg
//let's decode urlstring
var decoded_bson = bsonShortify.decode(urlstring); // = 4f907f7e53a58f4313000028

console.log('bson',bson);
console.log('urlstring',urlstring);
console.log('decoded_bson',decoded_bson);

我不知道这是否回答了大小比较的问题。(不会点踩,只是好奇) - WEFX
请问这段文本“4f907f7e53a58f4313000028”是什么意思,@Nedudi。 - Manish Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接