用于短URL的QR码编码模式

时间:2016-09-01 04:37:29

标签: optimization qr-code

通常的URL shortening技术使用通常的URL-charset中的少数几个字符,因为不需要更多。典型的短网址http://domain/code,其中代码是整数。假设我可以使用任何 base (base10,base16,base36,base62等)来表示数字。

QR Code have many encoding modes,我们可以优化QR码(minimal version to obtain lowest density),这样我们就可以测试一对baseX-modeY ......

什么是最好的基本模式对?

注意

猜猜......

两种模式适合“URL缩短配置文件”,

  • 0010 - 字母数字编码(每 2 个字符为11位)
  • 0100- 字节编码(每个字符8位)

我的选择是“大写base36”和字母数字(也编码“/”,“:”等),但没有看到任何证明它总是(对于任何URL长度)最好的。关于这种优化有一些很好的指南或数学演示吗?

理想(可能不切实际)

还有另一种变体,“编码模式可以根据需要在QR符号中混合使用”(维基百科)...所以,我们也可以使用

  • HTTP://DOMAIN/使用字母数字+ change_mode +数字编码(每 3 位10位)

对于长URL(长整数),当然,这是最好的解决方案(!),因为使用所有字符集,没有松散......是吗?

问题是在通常的QRCode图像生成器中无法访问这种优化(混合模式)......这是可行的吗?有一台发电机正确使用吗?

另一种答案格式

(实用)问题是关于 base 模式的最佳组合,因此我们可以将其表达为(例如Javascript)函数,

 function bestBaseMode(domain,number_range) {
    var dom_len = domain.length;
    var urlBase_len = dom_len+8; // 8 = "http://".length + "/".length;
    var num_min = number_range[0];
    var num_max = number_range[1];
    // ... check optimal base and mode
    return [base,mode];
 }

示例-1:是“bit.ly”,代码是ISO3166-1-numeric country-code, 范围从4到894.所以urlBase_len=14num_min=4num_max=894

示例-2:是“postcode-resolver.org”, number_range 参数是最频繁postal codes integer representations的范围,例如统计上推断范围从~999到~9999999。所以urlBase_len=27num_min=999num_max=9999999

示例-3:是“my-example3.net”, number_range 是一个双SHA-1代码,所以固定长度的代码有40个字节(2个连接的十六进制40位长数字)。所以num_max=num_min=Math.pow(8,40)

1 个答案:

答案 0 :(得分:0)

没有人想要我的赏金......我失去了它,现在也需要自己做工作;-)

关于理想的

goQR.me支持回复关于混合编码的特定问题,记住,遗憾的是,它无法使用,

  抱歉,我们的api不支持混合qr代码编码。   甚至标准也可以定义它。真实世界的QR码扫描仪应用程序   在手机上有大量的bug,我们不建议依赖   关于这个功能。

功能性答案

此功能在控制台中显示答案......这是一种简化和“强力”解决方案。

 /**
  * Find the best base-mode pair for a short URL template as QR-Code.
  * @param Msg for debug or report.
  * @param domain the string of the internet domain
  * @param digits10 the max. number of digits in a decimal representation
  * @return array of objects with equivalent valid answers.
  */
 function bestBaseMode(msg,  domain,digits10) {
    var commomBases= [2,8,10,16,36,60,62,64,124,248];  // your config
    var dom_len = domain.length;
    var urlBase_len = dom_len+8; // 8 = "http://".length + "/".length
    var numb = parseFloat( "9".repeat(digits10) );  
    var scores = [];
    var best = 99999;
    for(i in commomBases) {
        var b  = commomBases[i];
        // formula at http://math.stackexchange.com/a/335063
        var digits = Math.floor(Math.log(numb) / Math.log(b)) + 1;
        var mode = 'alpha';
        var len = dom_len + digits;
        var lost = 0;
        if (b>36) {
            mode = 'byte';
            lost = parseInt( urlBase_len*0.25); // only 6 of 8 bits used at URL
        }
        var score = len+lost; // penalty
        scores.push({BASE:b,MODE:mode,digits:digits,score:score});
        if (score<best) best = score;
    }
    var r = [];
    for(i in scores) {
        if (scores[i].score==best) r.push(scores[i]);
    }
    return r;
}

运行问题示例:

var x = bestBaseMode("Example-1",   "bit.ly",3);
console.log(JSON.stringify(x))   // "BASE":36,"MODE":"alpha","digits":2,"score":8

var x = bestBaseMode("Example-2",   "postcode-resolver.org",7);
console.log(JSON.stringify(x))  // "BASE":36,"MODE":"alpha","digits":5,"score":26

var x = bestBaseMode("Example-3",  "my-example3.net",97);
console.log(JSON.stringify(x))  // "BASE":248,"MODE":"byte","digits":41,"score":61