二维码可以重复,问题本身就是不成立的。
普通尺寸的二维码完全等价于一千多字节的一个网址。准确的说是一千多字节的字节流,它的尺寸是有限的,因为源数据就是有限的,并不是无限的。
过大的数据无法生成有限尺寸的二维码,如果数据太大,其生成的二维码会难以识别,所以一般二维码的数据量就在一千字节左右。
然后,用一千多字节能表示的可能性已经非常大了,想象一千位的密码是啥概念?
一般的网址还没一千字节呢,你会担心网址重复吗?
要论证二维码不会重复,关键是要证明信息到二维码的映射是一个单射,即不同的信息生成的二维码一定是不同的,而不是证明它是“一一映射”。其实是存在相同信息产生不同二维码的情况的,相同信息在纠错等级为L(7%)和H(30%)下所生成的二维码就是完全不同的。
那么如何证明不同信息所生成的二维码一定不一样呢?
用一个例子给大家简介一下二维码的生成原理:
设原信息是:
CN01
二维码版本为1,纠错等级为H
首先确定它的格式,包含字母和数字,共4位,需要Alphanumeric这种格式(模式编码:0010),格式信息会保存在编码的前几位,位数紧随其后
然后将主要信息二进制化,根据如下表格
我们可以得到 CN01:(C=12)(N=23)(0=0)(1=1),
两两分组为(12,23)(0,1)
再将每一组转换成11bits的二进制信息,这里是将头一个元素乘上45(总元素数)再加上后一个元素,这样可以保证不同的信息所产生的数据码一定是不同的,信息是完完全全没有损失的。
(12,23)=12*45+23=563=01,000,110,011
(0,1)=0*45+1=1=00,000,000,001
再加上模式编码0010以及位数信息(4位,在Version1-H下,位数信息为9bits,所以是000,000,100),我们得到:
除此之外,还需要加上结束码 0000 来标志结束。
由于接下来要把数据码按8bits划分,所以还要求总码长度必须是8的倍数,所以像CN01这个目前只有39位(39=4+9+2*11+4)的码,必须多补一个0,除此之外还不够,不同版本不同纠错级别对总码长度下限也有限制,如果总码太短,还要在后面加补齐码11101100 00010001,一直加,直到它满足位数的最低限制。
OK,编码部分至此告一段落,简单来说,不同信息所生成的数据码一定是不同的。
除了数据码外,总码还包含了大量的纠错码,纠错码部分比较复杂,在此就不介绍了(因为我也不懂)。可以肯定的是,纠错码是加在数据码后面的,所以不同数据码所产生的总码一定是不同的。
最后只需要证明,不同总码生成的二维码一定是不同的即可回答题主的问题。
总码到二维码的过程简单来说就是,把不同字节按红线顺序填充到下面这些纠错码字区块中,然后再把版本信息、纠错等级这些杂七杂八的东西放到特定区域,一个二维码就完成了....吗?
并没有,如果咱们的信息是111111111111111111...111,全是1,二维码就会变成黑疙瘩,这样很可能根本扫不出来,所以要再叠上一层掩码(简单来说就是将刚生成的图像与下述图像做一个异或操作),掩码分为如下几种,主要目的就是让二维码的黑白格子数量更平衡一些,掩码的选择是有相关算法的,在扫描二维码的过程中也会判断出所使用的的掩码类型,具体方法不(我)再(也)赘(不)述(懂)。
做完掩码,咱们的二维码就大功告成了。显然,在已知掩码图样的情况下,异或操作也不会造成信息损失,不同的总码经过填充、掩码这两个过程后所得到的二维码仍然是不同的!
最后总结一下:不同的信息——不同的数据码——不同的总码——不同的二维码图样
补充:
信息容量:
即使是Version-40的二维码,也只能存储几千个字而已。
版本:
ABCABCABCABCABCABCABCABC (二维码自动识别)
实际上,二维码有很多种,我们日常生活中使用的都是二维码中的QR码(全称为快速响应矩阵图码),除此之外,还有汉信码、PDF码等。
http://zh.wikipedia.org/ (二维码自动识别)