題主的疑問可以分解為以下兩點:
(1)二維碼有沒有被人類用完的可能?
(2)有沒有可能存在相同的二維碼,但是其原始信息卻不一樣?
可能這也是很多朋友的疑問,全世界每天有很多人都在使用二維碼,據估計可能一天產生的二維碼就達上百億,那么長此以往下去,二維碼不就用完了嗎?萬一哪天別人新生成的支付寶收款碼正好是我之前用過的,那錢豈不是就轉給我了?哈哈,我想說,你想得美。馬云爸爸會允許嗎?下面就我自己的理解,給大家講講其中的原理。
首先需要先補充一點二維碼的知識,不感興趣的朋友可以直接跳到文末解答疑問的部分。
01
二維碼原理簡介
通俗的講,二維碼就是使用某些特定幾何圖形按照一定規律排列從而達到記錄符號信息的一種編碼技術,編碼的輸入端是網址、電子名片、郵件地址等,輸出端是二維的黑白方塊矩陣。編碼的碼制有很多種,最常見的就是QR(Quick-Response)code,此外還有DataMatrix,MaxiCode等等。
典型的QRcode如上圖所示,主要分為功能圖形、編碼區格式兩大塊,其中功能圖形包括位置探測圖形、位置探測圖形分隔符、定位圖形和校正圖形
校正圖形:與規格對應,一旦規格定下來,校正圖形的數量和位置也就確定了
格式信息:這個代表二維碼的糾錯級別,二維碼總共有為L、M、Q、H四種糾錯等級,L最低,H最高,等級越高,二維碼可被正確掃描的概率就越大,但同時二維碼可攜帶的有效信息也會變少
版本信息:可以理解為二維碼的規格,QR碼符號共有40種規格的矩陣(一般為黑白色),從21x21(版本1),到177x177(版本40),每一版本符號比前一版本每邊增加4個模塊
數據和糾錯碼:數據就是指真實編碼后的內容,比如網址對應的黑白塊,糾錯字是為了糾正傳輸過程中丟失部分信息后,能正確解碼用的,日常生活中二維碼經常會被人為扭曲、磨損,此時糾錯碼就派上用場了。
二維碼特點一:編碼的數據容量量有限制
二維碼對編碼的數據容量是有限制的,你給我一本新華字典,我肯定是無法給你生成二維碼的,因為新華字典字太多了,遠遠超出了二維碼容許的數據上限
上圖是QR碼可以容納的數據容量表,可以看出,通過QR碼制來生成二維碼,最多容納7089個數字或者4296個字母,如果是中文漢字,那么采用UTF-8編碼的漢字最多可以容納984個,差不多一個頭條問答的字數。這樣就從源頭上保證了可以被轉成二維碼的信息是有限制的。
二維碼特點二:二維碼的編碼是可逆的,原始信息和二維碼一一對應
二維碼的所有編碼步驟都是可逆的,如果給我一個二維碼,并且告訴我編碼步驟中的參數設定,我一定可以把原始信息給解出來,這就從原理上保證了原始信息和二維碼的一一對應關系。確實,二維碼的“長相”是有限的,但是可用于編碼的數據量也是有限的,而且二維碼的數量是大于可編碼信息的組合數量的,這也是保證原始信息和二維碼一一對應的數學證據。
02
回答上面的兩個問題
(1)二維碼有沒有被人類用完的可能?
答:問題本身不成立,這是錯誤的把二維碼當成了憑空生成的密鑰之類的東西了,實際上可用于生成二維碼的數據量(數字、字幕、漢字、日文)就是有限的,并且小于二維碼在數學上的數量上限,所以本身問題就不成立。
(2)有沒有可能存在相同的二維碼,但是其原始信息卻不一樣?
答:如果僅從“長相”上相同,即黑白塊數量、大小、位置都一樣,是有可能對應的原始信息不一樣的,這是因為二維碼的編碼,是原始信息+糾錯級別+編碼類型(數字、字母、漢字等)+版本信息四項因子一起構造的,兩個不同的信息,比如www.baidu.com和“周杰倫”,如果選擇的糾錯級別、編碼類型、二維碼版本不一樣,是可能生成“長相”完全一致的二維碼的。如果兩張“長相”一樣的二維碼,而且糾錯級別、編碼類型、版本信息也完全一致,那么逆推出的原始信息,一定是一樣的。
03
衍生問題
有朋友可能會繼續問,既然能被生成二維碼的信息是有限的,那么總有一天所有組合都被人類用完了,這個時候肯定會出現重復的二維碼,這個怎么保證安全呢?事實上,二維碼除了以上維度以外,還有一個時間維度,二維碼分靜態二維碼和動態二維碼,靜態二維碼永遠有效,而動態二維碼則在一定時間內有效,比如支付寶的付款碼,這有點像計算機中的HDCP動態分配IP地址技術,如果某個用戶下線了,那么他的IP地址會分配給新上線的用戶,這樣就能保證一個局域網內的IP地址夠用的,當然如果用戶量達到上限,還是要新增IP地址范圍的,這也是IPv6存在的主要原因。