日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

標(biāo)識符 ID 是我們作為軟件工程師再熟悉不過的字段和概念了,我們經(jīng)常打交道的 MySQL 就經(jīng)常使用 ID 作為主鍵,ID 在軟件工程甚至生活中都是一個非常常見的概念,我們?yōu)槭裁纯偸切枰跇I(yè)務(wù)或者系統(tǒng)中引入『無意義』的 ID 呢,在這里先來看兩個有意義的 ID:

  • 日常生活中使用的 18 位身份證號;
  • 支付票據(jù)上面的 20191002XXXXXXX;

上述的兩個 ID 是否會有重復(fù)的可能?這對于今天想要分析和討論的事情密切相關(guān),在這篇文章中作者就會分析『為什么總是需要無意義的 ID』。

概述

我們首先需要解決的問題是 ID 到底是什么,ID 一般會被認(rèn)為是 identifier 的縮寫,在 Wikipedia 上我們能夠找到這樣的定義:

An identifier is a name that identifies (that is, labels the identity of) either a unique object or a unique class of objects, where the "object" or class may be an idea, physical [countable] object (or class thereof), or physical [noncountable] substance (or class thereof). The abbreviation ID often refers to identity, identification (the process of identifying), or an identifier (that is, an instance of identification). An identifier may be a word, number, letter, symbol, or any combination of those.

標(biāo)識符(identifier)就是一個可以唯一識別一個對象或者物體的名稱,被識別的對象可能是一些想法、物理上可數(shù)的對象或者物理上的不可數(shù)物質(zhì)。它的前綴 ID 經(jīng)常被用來表示身份、鑒定過程或者標(biāo)識符,其中的標(biāo)識符可能是一個單詞、數(shù)字、字母、符號或者上述元素的任意組合。

在標(biāo)識符的定義中我們需要特別注意的是『唯一』這個詞,這個詞是其定義中最關(guān)鍵的信息,標(biāo)識符一定能夠幫助我們識別唯一一個的對象或者物體,如果它不能實現(xiàn)這個作用,就不是標(biāo)識符。唯一這個詞幫助我們確定了標(biāo)識符的特性,也為我們后面的分析過程鋪平了道路。

設(shè)計

在這一節(jié)中我們將開始分析為什么很多業(yè)務(wù)或者場景中都需要一個唯一 ID,例如:消息隊列、TCP 通信等場景,我們可以將這一問題歸結(jié)到兩個原因上:

  • 需要通過唯一的標(biāo)識符對數(shù)據(jù)或者事件進行識別或者去重;
  • 只有無意義的標(biāo)識符才會絕對唯一的,任何攜帶其他信息的標(biāo)識都可能重復(fù);

唯一性

消息隊列往往需要對外保證服務(wù)質(zhì)量,可能需要提供包括最多一次、最少一次和正好一次在內(nèi)的服務(wù)質(zhì)量,由于網(wǎng)絡(luò)可能存在超時等不確定性,當(dāng)我們想要實現(xiàn)正好一次時,就一定需要一種機制能夠在接收方識別發(fā)送方發(fā)出的重復(fù)消息,在這時就需要使用唯一的標(biāo)識符來解決這個問題:

身份證上的 ID 能保證唯一性么?

 

我們在之前的系列文章 為什么 TCP 建立連接需要三次握手 提到的 TCP 連接中的序列號也是一個唯一的標(biāo)識符,它能夠幫助我們判斷對數(shù)據(jù)進行去重,保證應(yīng)用層的協(xié)議不會收到異常的數(shù)據(jù)包,這些場景都需要用到標(biāo)識符的唯一性,唯一性為我們帶來的就是精確識別對象的能力。

在與網(wǎng)絡(luò)相關(guān)的場景下,使用唯一 ID 的例子非常普遍,假如我們想通過支付寶或者微信的 API 向其他人發(fā)起一筆轉(zhuǎn)賬,如果這次請求發(fā)生了超時,那么我的這筆轉(zhuǎn)賬請求到底有沒有被處理呢?

身份證上的 ID 能保證唯一性么?

 

當(dāng)前的節(jié)點對于這筆轉(zhuǎn)賬請求的結(jié)果是不知道的,如果這時重新請求可能會發(fā)生二次轉(zhuǎn)賬這類嚴(yán)重的問題,但是如果不重新請求,轉(zhuǎn)賬可能沒有生效,這時如果我們引入一個無意義的 ID 來幫助接收方識別請求的唯一性就能很好地解決這個問題:

  1. 如果接收方已經(jīng)成功處理 ID 對應(yīng)的請求,那么就直接返回;
  2. 如果接收方?jīng)]有處理 ID 對應(yīng)的請求,就正常進行處理;

為了保證請求的唯一性,根據(jù)業(yè)務(wù)對于唯一性要求的強弱,我們需要在接收方對 ID 進行存儲,可以在內(nèi)存中,也可以在數(shù)據(jù)庫中,最重要的是唯一的 ID 為接收方提供了判斷重復(fù)的重要依據(jù)。

除了在不穩(wěn)定的網(wǎng)絡(luò)中,數(shù)據(jù)庫也包含 ID 標(biāo)識符這一概念,我們在數(shù)據(jù)庫中往往叫做主鍵,它在一般情況下都是一個遞增的唯一整數(shù),絕大多數(shù)的表都會使用 ID 作為表的主鍵來保證數(shù)據(jù)的唯一性,當(dāng)我們想要對數(shù)據(jù)進行增刪改查等操作時,使用主鍵 ID 查詢數(shù)據(jù)也是性能最優(yōu)并且最不容易出現(xiàn)問題的做法。

無意義

無意義的意思其實就是 ID 中不應(yīng)該包含任何與具體場景或者業(yè)務(wù)相關(guān)的內(nèi)容,包含這些內(nèi)容并不是不可以,只是一旦出現(xiàn)這些內(nèi)容,要么 ID 重復(fù)的可能性會增加,這很可能對我們的業(yè)務(wù)邏輯造成比較嚴(yán)重的影響,以我們的身份證號為例,它的 18 位數(shù)字(或符號)大多都是有意義的。

身份證上的 ID 能保證唯一性么?

 

這 18 位數(shù)字中的前 6 位表示的是地區(qū),也就是省份、城市和區(qū)縣,隨后的 8 位表示的是出生年月日,接下來的 3 位才同時表示 ID 和性別,最后 1 位用于做校驗碼防止出現(xiàn)身份證號輸錯的情況。用上述圖中的黃色部分中有一半的數(shù)字是用來表示出生的男性,另一半表示出生的女性,所以如果同一個地區(qū)的同一天,同時出生了 501 位男性或者女性就會導(dǎo)致潛在的重復(fù)問題。

上面談到的問題其實也是我們在各種業(yè)務(wù)場景中經(jīng)常能夠遇到的問題,18 位的數(shù)字中真正用于表示序列的 ID 其實只有 1000 的一半,如果 18 位數(shù)都是無意義的,那它們可以表示 10 億億個人,但是一旦在 ID 中引入了業(yè)務(wù)上的具體信息,就增加了沖突的可能性。

業(yè)務(wù)記錄上主鍵的長度往往都是固定的,大多數(shù)業(yè)務(wù)的主鍵都會使用整數(shù),它的上限一般就是 2^64,如果這些位數(shù)都用來表示記錄的 ID,那么在有生之年基本上是不可能被使用完的,但是一旦我們將業(yè)務(wù)信息加入 ID,就會讓原本無意義的 ID 變得有意義從而影響它的唯一性。

另一個比較類似的例子其實是分布式的 ID 生成器,Snowflake 算法會為 64 個比特的整數(shù)賦予不同的信息:

范圍長度作用0-01不使用1-4141毫秒級時間戳42-465數(shù)據(jù)中心標(biāo)識符47-515機器標(biāo)識符52-6312序列號

從這個設(shè)計來看,我們的假設(shè)其實是一臺機器上一毫秒最多只能生成 4096 個 ID,一旦超過了這個這個數(shù)量就有可能導(dǎo)致 ID 沖突或者亂序,從而失去其唯一性;這個算法中涉及的時間戳、數(shù)據(jù)中心標(biāo)識符、機器標(biāo)識符都沒有辦法解決唯一性的問題,哪怕這三者完全相等,最終還是有沖突的可能,我們?nèi)匀恍枰褂脽o其他意義的序列號來保證 ID 的唯一。

總結(jié)

其實不難看出,使用無意義 ID 的主要目的就是利用它的唯一性保證對象的標(biāo)識符不會發(fā)生沖突,無意義 ID 的唯一作用就是保證唯一性,這能幫助我們避免業(yè)務(wù)字段可能存在潛在沖突的可能,這也提示我們想要使用聯(lián)合字段構(gòu)成主鍵時一定要深思熟慮。

如果我們想要在具有唯一性的標(biāo)識符中加入業(yè)務(wù)信息,一定要注意這可能會減少用于保證唯一性的『空間』,當(dāng)然對于一個足夠大的空間來說,這其實并沒有什么問題;但是類型為 int64 的 ID 中加入業(yè)務(wù)數(shù)據(jù)還是需要仔細(xì)思考可擴展性以及預(yù)留的信息是否足夠業(yè)務(wù)的發(fā)展。

到最后,我們還是來看一些比較開放的相關(guān)問題,有興趣的讀者可以仔細(xì)思考一下下面的問題:

  • 軟件工程還有哪些場景利用了 ID 的唯一性?
  • 在日常生活中除了身份證號之外,還有哪些 ID 也有比較高的沖突可能性?

分享到:
標(biāo)簽:身份證
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定