用ULID替代 UUID 的最佳实践
鍦� C# 寮€鍙戜腑锛孶UID锛堥€氱敤鍞�竴鏍囪瘑绗︼級鏄�竴绉嶅父瑙佺殑鏍囪瘑绗︼紝鐢ㄤ簬鐢熸垚鍏ㄥ眬鍞�竴鐨� ID銆傜劧鑰岋紝闅忕潃鍒嗗竷寮忕郴缁熷拰楂樻€ц兘搴旂敤鐨勯渶姹傚�鍔狅紝UUID 鐨勪竴浜涚己鐐归€愭笎鏄剧幇銆備负浜嗚В鍐宠繖浜涢棶棰橈紝ULID锛圲niversally Unique Lexicographically Sortable Identifier锛変綔涓轰竴绉嶆浛浠f柟妗堬紝姝e湪琚�秺鏉ヨ秺澶氱殑寮€鍙戣€呴噰鐢ㄣ€�
鐐瑰嚮涓嬪浘鏌ョ湅锛� C# 涓� GUID 鐨勫叏闈㈣В鏋愶細鐢熸垚銆佹牸寮忓寲涓�搴旂敤鍦烘櫙锛孨et9鐗堟湰涓嬬殑GUID V7鐗堟湰浣跨敤
1. 浠€涔堟槸 UUID锛�
UUID锛圲niversally Unique Identifier锛夋槸涓€绉� 128 浣嶇殑鏍囪瘑绗︼紝閫氬父鐢ㄤ簬鏍囪瘑鏁版嵁搴撹�褰曘€佸垎甯冨紡绯荤粺涓�殑瀵硅薄绛夈€俇UID 鐨勪富瑕佺壒鐐规槸锛�
鈥� 鍏ㄥ眬鍞�竴鎬�锛氱悊璁轰笂锛孶UID 鐨勯噸澶嶆�鐜囨瀬浣庛€�
鈥� 鍥哄畾闀垮害锛歎UID 鐨勯暱搴︿负 128 浣嶏紙16 瀛楄妭锛夈€�
鈥� 鍏ㄥ眬鍞�竴鎬�锛氱悊璁轰笂锛孶UID 鐨勯噸澶嶆�鐜囨瀬浣庛€�
鈥� 鍥哄畾闀垮害锛歎UID 鐨勯暱搴︿负 128 浣嶏紙16 瀛楄妭锛夈€�
灏界� UUID 鍦ㄨ�澶氬満鏅�腑琛ㄧ幇鑹�ソ锛屼絾瀹冧篃瀛樺湪涓€浜涘眬闄愭€с€�
2. UUID 鐨勫眬闄愭€�
1. 鎺掑簭闂��
UUID 鏄�殢鏈虹敓鎴愮殑锛屾棤娉曟寜鏃堕棿椤哄簭鎺掑簭銆傝繖鍦ㄩ渶瑕佹寜鏃堕棿椤哄簭瀛樺偍鎴栨煡璇㈡暟鎹�殑鍦烘櫙涓�細瀵艰嚧鎬ц兘闂��銆�
2. 鍙��鎬у樊
3. 瀛樺偍鏁堢巼浣�
UUID 閫氬父浠ュ瓧绗︿覆褰㈠紡瀛樺偍锛屽崰鐢ㄨ緝澶氱殑瀛樺偍绌洪棿锛�36 涓�瓧绗︼級銆�
4. 绱㈠紩鎬ц兘闂��
鍦ㄦ暟鎹�簱涓�紝UUID 鐨勯殢鏈烘€т細瀵艰嚧绱㈠紩鍒嗗竷涓嶅潎鍖€锛屼粠鑰岄檷浣庢煡璇㈡€ц兘銆�
1. 鎺掑簭闂��
UUID 鏄�殢鏈虹敓鎴愮殑锛屾棤娉曟寜鏃堕棿椤哄簭鎺掑簭銆傝繖鍦ㄩ渶瑕佹寜鏃堕棿椤哄簭瀛樺偍鎴栨煡璇㈡暟鎹�殑鍦烘櫙涓�細瀵艰嚧鎬ц兘闂��銆�
2. 鍙��鎬у樊
3. 瀛樺偍鏁堢巼浣�
UUID 閫氬父浠ュ瓧绗︿覆褰㈠紡瀛樺偍锛屽崰鐢ㄨ緝澶氱殑瀛樺偍绌洪棿锛�36 涓�瓧绗︼級銆�
4. 绱㈠紩鎬ц兘闂��
鍦ㄦ暟鎹�簱涓�紝UUID 鐨勯殢鏈烘€т細瀵艰嚧绱㈠紩鍒嗗竷涓嶅潎鍖€锛屼粠鑰岄檷浣庢煡璇㈡€ц兘銆�
ULID锛圲niversally Unique Lexicographically Sortable Identifier锛夋槸涓€绉� 128 浣嶇殑鍞�竴鏍囪瘑绗︼紝涓� UUID 绫讳技锛屼絾瀹冭В鍐充簡 UUID 鐨勪竴浜涘眬闄愭€с€俇LID 鐨勪富瑕佺壒鐐瑰寘鎷�細
1. 鎸夋椂闂存帓搴�
ULID 鐨勫墠 48 浣嶅熀浜庢椂闂存埑锛堟�绉掔骇锛夛紝鍚� 80 浣嶄负闅忔満鏁般€傝繖浣垮緱 ULID 鍙�互鎸夋椂闂撮『搴忔帓搴忥紝闈炲父閫傚悎闇€瑕佹椂闂存帓搴忕殑鍦烘櫙銆�
2. 鍙��鎬ф洿楂�
ULID 浣跨敤 Base32 缂栫爜锛岀敓鎴愮殑瀛楃�涓叉洿鐭�笖鏇存槗璇汇€備緥濡傦細01H3Z5VJ8XK4Y5F3G7T9Q2W1A6
3. 瀛樺偍鏁堢巼鏇撮珮
ULID 鐨勫瓧绗︿覆闀垮害涓� 26 涓�瓧绗︼紝姣� UUID 鐨� 36 涓�瓧绗︽洿鐭�紝鍗犵敤鏇村皯鐨勫瓨鍌ㄧ┖闂淬€�
4. 璺ㄨ�瑷€鏀�寔
ULID 鏄�竴绉嶆爣鍑嗘牸寮忥紝鏀�寔澶氱�缂栫▼璇�█锛屽寘鎷� C#銆�
1. 鎸夋椂闂存帓搴�
ULID 鐨勫墠 48 浣嶅熀浜庢椂闂存埑锛堟�绉掔骇锛夛紝鍚� 80 浣嶄负闅忔満鏁般€傝繖浣垮緱 ULID 鍙�互鎸夋椂闂撮『搴忔帓搴忥紝闈炲父閫傚悎闇€瑕佹椂闂存帓搴忕殑鍦烘櫙銆�
2. 鍙��鎬ф洿楂�
ULID 浣跨敤 Base32 缂栫爜锛岀敓鎴愮殑瀛楃�涓叉洿鐭�笖鏇存槗璇汇€備緥濡傦細01H3Z5VJ8XK4Y5F3G7T9Q2W1A6
3. 瀛樺偍鏁堢巼鏇撮珮
ULID 鐨勫瓧绗︿覆闀垮害涓� 26 涓�瓧绗︼紝姣� UUID 鐨� 36 涓�瓧绗︽洿鐭�紝鍗犵敤鏇村皯鐨勫瓨鍌ㄧ┖闂淬€�
4. 璺ㄨ�瑷€鏀�寔
ULID 鏄�竴绉嶆爣鍑嗘牸寮忥紝鏀�寔澶氱�缂栫▼璇�█锛屽寘鎷� C#銆�
鈥� 鏇村ソ鐨勫彲璇绘€�
ULID 鐨� Base32 缂栫爜浣垮叾鏇寸煭銆佹洿鏄撹�锛屼究浜庡湪鏃ュ織銆佽皟璇曚俊鎭�垨鐢ㄦ埛鐣岄潰涓�樉绀恒€�
鈥� 鏇撮珮鐨勫瓨鍌ㄦ晥鐜�
ULID 鐨勫瓧绗︿覆闀垮害涓� 26 涓�瓧绗︼紝姣� UUID 鐨� 36 涓�瓧绗︾煭绾� 28%锛屽湪澶ц�妯″瓨鍌ㄥ満鏅�腑鍙�互鑺傜渷澶ч噺绌洪棿銆�
鈥� 鏇村ソ鐨勭储寮曟€ц兘
鐢变簬 ULID 鐨勬椂闂存埑閮ㄥ垎鏄�€掑�鐨勶紝瀹冨湪鏁版嵁搴撲腑鎻掑叆鏃朵細淇濇寔绱㈠紩鐨勯『搴忔€э紝浠庤€屾彁楂樻煡璇㈡€ц兘銆�
鈥� 鏇村ソ鐨勫彲璇绘€�
ULID 鐨� Base32 缂栫爜浣垮叾鏇寸煭銆佹洿鏄撹�锛屼究浜庡湪鏃ュ織銆佽皟璇曚俊鎭�垨鐢ㄦ埛鐣岄潰涓�樉绀恒€�
鈥� 鏇撮珮鐨勫瓨鍌ㄦ晥鐜�
ULID 鐨勫瓧绗︿覆闀垮害涓� 26 涓�瓧绗︼紝姣� UUID 鐨� 36 涓�瓧绗︾煭绾� 28%锛屽湪澶ц�妯″瓨鍌ㄥ満鏅�腑鍙�互鑺傜渷澶ч噺绌洪棿銆�
鈥� 鏇村ソ鐨勭储寮曟€ц兘
鐢变簬 ULID 鐨勬椂闂存埑閮ㄥ垎鏄�€掑�鐨勶紝瀹冨湪鏁版嵁搴撲腑鎻掑叆鏃朵細淇濇寔绱㈠紩鐨勯『搴忔€э紝浠庤€屾彁楂樻煡璇㈡€ц兘銆�
浣跨敤寮€婧愬簱 Ulid鏉ョ敓鎴愬拰鎿嶄綔 ULID銆�
5.1 瀹夎� NuGet 鍖�
閫氳繃 NuGet 瀹夎� NUlid搴擄細
dotnet add package NUlid5.2 鐢熸垚 ULID
浣跨敤 Ulid.NewUlid鏂规硶鐢熸垚涓€涓�柊鐨� ULID锛�
usingNUlid;
varulid = Ulid.NewUlid;
Console.WriteLine("鐢熸垚鐨� ULID: " ulid);
//鐢熸垚鐨� ULID: 01JRS29BZ18KWK6TDPSKMB93ZY5.3 浠庢椂闂存埑鐢熸垚 ULID
鍩轰簬鎸囧畾鐨勬椂闂寸敓鎴� ULID锛�
var timestamp = DateTimeOffset.UtcNow;
var ulid = Ulid.NewUlid(timestamp);
Console.WriteLine("鍩轰簬鏃堕棿鐢熸垚鐨� ULID: " ulid);
// 鍩轰簬鏃堕棿鐢熸垚鐨� ULID: 01JRS2APB4C2JG7Y2X6D89XRDZ5.4 瑙f瀽 ULID
ULID 鍙�互瑙f瀽鍑烘椂闂存埑閮ㄥ垎锛�
usingNUlid;
varulid = Ulid.NewUlid;
Console.WriteLine("ULID: " ulid);
Console.WriteLine("鏃堕棿鎴�: " ulid.Time.ToString("o"));
//ULID: 01JRS2BPS42D6VX1AYQZJFMQZQ
1. 鏃ュ織绯荤粺
浣跨敤 ULID 浣滀负鏃ュ織鐨勫敮涓€鏍囪瘑绗︼紝渚夸簬鎸夋椂闂撮『搴忓瓨鍌ㄥ拰鏌ヨ�銆�
2. 鍒嗗竷寮忕郴缁�
鍦ㄥ垎甯冨紡绯荤粺涓�紝ULID 鍙�互浣滀负鍏ㄥ眬鍞�竴鐨勬爣璇嗙�锛屽悓鏃舵敮鎸佹椂闂存帓搴忋€�
3. 鏁版嵁搴撲富閿�
浣跨敤 ULID 鏇夸唬 UUID 浣滀负涓婚敭锛屼紭鍖栫储寮曟€ц兘骞惰妭鐪佸瓨鍌ㄧ┖闂淬€�
4. 浜嬩欢娴佸�鐞�
鍦ㄤ簨浠堕┍鍔ㄦ灦鏋勪腑锛孶LID 鍙�互纭�繚浜嬩欢鎸夋椂闂撮『搴忓�鐞嗐€�
1. 鏃ュ織绯荤粺
浣跨敤 ULID 浣滀负鏃ュ織鐨勫敮涓€鏍囪瘑绗︼紝渚夸簬鎸夋椂闂撮『搴忓瓨鍌ㄥ拰鏌ヨ�銆�
2. 鍒嗗竷寮忕郴缁�
鍦ㄥ垎甯冨紡绯荤粺涓�紝ULID 鍙�互浣滀负鍏ㄥ眬鍞�竴鐨勬爣璇嗙�锛屽悓鏃舵敮鎸佹椂闂存帓搴忋€�
3. 鏁版嵁搴撲富閿�
浣跨敤 ULID 鏇夸唬 UUID 浣滀负涓婚敭锛屼紭鍖栫储寮曟€ц兘骞惰妭鐪佸瓨鍌ㄧ┖闂淬€�
4. 浜嬩欢娴佸�鐞�
鍦ㄤ簨浠堕┍鍔ㄦ灦鏋勪腑锛孶LID 鍙�互纭�繚浜嬩欢鎸夋椂闂撮『搴忓�鐞嗐€�
ULID 鏄� UUID 鐨勪竴绉嶄紭绉€鏇夸唬鏂规�锛岀壒鍒�€傚悎闇€瑕佹椂闂存帓搴忋€侀珮鎬ц兘绱㈠紩鍜屾洿楂樺彲璇绘€х殑鍦烘櫙銆傚湪 C# 涓�紝浣跨敤 ULID 鍙�互鏄捐憲鎻愬崌绯荤粺鐨勬€ц兘鍜屽彲缁存姢鎬с€� 閫氳繃鍚堢悊浣跨敤 ULID锛屽紑鍙戣€呭彲浠ユ瀯寤烘洿楂樻晥銆佹洿鍙�潬鐨勫垎甯冨紡绯荤粺鍜屽簲鐢ㄧ▼搴忋€�