Upstream 54 UUID KO - teamswyg/laya-tools GitHub Wiki

PDCA54: UUID μ›μ²œκ³Ό 독립 검증 계약

English

이 μž‘μ—…μ€ 곡개 후보 go53-uuid-canonical-parseλ₯Ό μ‹€μ œ 검사할 수 μžˆλŠ” μž‘μ€ μ½”λ“œ μž‘μ—…μœΌλ‘œ μ€€λΉ„ν•œ 개발 κΈ°λ‘μž…λ‹ˆλ‹€. λͺ¨λΈμ΄ 이 μž‘μ—…μ„ ν’€μ—ˆκ±°λ‚˜ λ‚œμ΄λ„λ₯Ό μ•Œμ•„λƒˆλ‹€λŠ” 기둝은 μ•„λ‹™λ‹ˆλ‹€. 120개 μ›μ²œ μ‘°μ‚¬μ˜ μ›λž˜ 후보λ₯Ό μ •λ‹΅Β·ν•™μŠ΅ 자료둜 λ°”κΎΈμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ›λž˜ μ½”λ“œμ™€ μƒˆ μž‘μ—…μ˜ 차이

μ›μ²œμ€ google/uuid의 κ³ μ • revisionμž…λ‹ˆλ‹€. 원본 uuid.go의 Parse와 ParseBytesλŠ” ν•˜μ΄ν”ˆμ΄ μžˆλŠ” λ¬Έμžμ—΄, λŒ€λ¬Έμž, 32자리 μ›μ‹œ 16μ§„μˆ˜, URN을 ν—ˆμš©ν•©λ‹ˆλ‹€. 38λ°”μ΄νŠΈ μž…λ ₯μ—μ„œλŠ” μ•žλ’€ 문자λ₯Ό 직접 κ²€μ‚¬ν•˜μ§€ μ•Šμ•„ [...] 같은 포μž₯도 ν—ˆμš©ν•©λ‹ˆλ‹€. 일뢀 λ’€μͺ½ 였λ₯˜μ—μ„œλŠ” 이미 읽은 UUID의 일뢀와 였λ₯˜λ₯Ό ν•¨κ»˜ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μƒˆ μž‘μ—…μ€ 원본을 κ·ΈλŒ€λ‘œ λ‘” 채 ParseCanonical(s string) (UUID, error) ν•˜λ‚˜λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 APIλŠ” μ†Œλ¬Έμž ASCII 16μ§„μˆ˜μ™€ μ§€μ •λœ λ„€ ν•˜μ΄ν”ˆμœΌλ‘œ 이루어진 μ •ν™•ν•œ 36λ°”μ΄νŠΈ μž…λ ₯만 ν—ˆμš©ν•©λ‹ˆλ‹€. 잘λͺ»λœ μž…λ ₯μ—μ„œλŠ” μ–΄λŠ μœ„μΉ˜μ—μ„œ μ‹€νŒ¨ν•˜λ“  였λ₯˜μ™€ 0 UUIDλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 정상 μž…λ ₯의 버전·variant λΉ„νŠΈλŠ” μ œν•œν•˜μ§€ μ•Šμ•„ λͺ¨λ‘ 0인 κ°’κ³Ό λͺ¨λ‘ 1인 값도 λ°›μŠ΅λ‹ˆλ‹€. μ›λž˜ APIλ₯Ό μ—„κ²©ν•˜κ²Œ λ°”κΎΈλŠ” μž‘μ—…μ΄ μ•„λ‹™λ‹ˆλ‹€.

μ›μ²œΒ·λΌμ΄μ„ μŠ€ λ²”μœ„

ν•­λͺ© μ΄λ²ˆμ— κ³ μ •ν•œ λ²”μœ„
μ›μ²œ revision 2d3c2a9cc518326daf99a383f07c4d3c44317e4d
파일 원본 Go 파일 23개(원본 ν…ŒμŠ€νŠΈ 파일 7개 포함), go.mod, LICENSE: 합계 25개
무결성 각 파일의 SHA-256κ³Ό 곡개 Git blob μ‹λ³„μžλ₯Ό λͺ¨λ‘ 확인
μ™ΈλΆ€ μ˜μ‘΄μ„± 이 μ½”λ“œ νŒ¨ν‚€μ§€μ˜ importsλŠ” ν‘œμ€€ 라이브러리뿐
λΌμ΄μ„ μŠ€ 원본 BSD-3-Clause LICENSE
NOTICE ν™•μΈν•œ revision의 전체 μ›μ²œ tree에 μ—†μŒ. μž„μ˜ NOTICEλ₯Ό λ§Œλ“€μ§€ μ•ŠμŒ

원본 LICENSE와 νŒŒμΌμ— 있던 Google μ €μž‘κΆŒ ν‘œκΈ°λŠ” 볡사본에 λ³΄μ‘΄ν•©λ‹ˆλ‹€. LICENSE의 μ €μž‘κΆŒ μ—°λ„λŠ” 2009Β·2014이며 uuid.go의 ν‘œκΈ°λŠ” 2018μž…λ‹ˆλ‹€. time_test.go와 version6_test.goμ—λŠ” 별도 파일 헀더가 μ—†λ‹€λŠ” 점도 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. μ„ νƒν•œ νŒŒμΌμ—μ„œ 별도 λΌμ΄μ„ μŠ€λ‚˜ λ‹€λ₯Έ ν”„λ‘œμ νŠΈ 볡사 ν‘œμ‹œλŠ” λ°œκ²¬ν•˜μ§€ λͺ»ν–ˆμ§€λ§Œ, 이것은 μ €μž₯μ†Œ μ „μ²΄Β·λ―Έλž˜ dependency·미래 λͺ¨λΈ 배포에 λŒ€ν•œ 일괄 법적 보증이 μ•„λ‹™λ‹ˆλ‹€. μ†ŒμŠ€ 재배포 λ•Œ 원본 μ €μž‘κΆŒΒ·μ‘°κ±΄Β·λ©΄μ±… 쑰항을 λ³΄μ‘΄ν•˜κ³ , λ°”μ΄λ„ˆλ¦¬ 배포 λ•Œλ„ ν•΄λ‹Ή 쑰건에 λ§žλŠ” κ³ μ§€λ₯Ό μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

원본 go.modλŠ” λͺ¨λ“ˆ μ„ μ–Έλ§Œ μžˆμŠ΅λ‹ˆλ‹€. 원본 λ°”μ΄νŠΈλŠ” κ³ μ •ν•˜κ³ , 격리 μ‹œν—˜μš© λ³΅μ‚¬λ³Έμ—λŠ” μ‹ λ’°ν•œ λͺ¨λ“ˆ 이름 github.com/google/uuid와 Go 1.27.1을 λͺ…μ‹œν•œ μ΅œμ†Œ μ‹€ν–‰ λ ˆμ‹œν”Όλ₯Ό μ”λ‹ˆλ‹€. μ›μ²œ μ €μž₯μ†Œλ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ μ˜μ‘΄μ„±μ„ λ‚΄λ €λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

검증기가 μ§€μ›ν•˜λŠ” κ΅¬ν˜„ λ²”μœ„

이번 κ²€μ¦κΈ°λŠ” 원본 uuid.go 10,254λ°”μ΄νŠΈ λ˜λŠ” μ‹ λ’°ν•œ Go 1.27.1 gofmtκ°€ μ •κ·œν™”ν•œ 10,251λ°”μ΄νŠΈ 볡사본을 μ •ν™•ν•œ μ•žλΆ€λΆ„μœΌλ‘œ λ³΄μ‘΄ν•˜κ³ , 끝에 μƒˆ ν•¨μˆ˜ ν•˜λ‚˜λ§Œ μΆ”κ°€ν•˜λŠ” κ΅¬ν˜„μ„ μ§€μ›ν•©λ‹ˆλ‹€. 원본이 μ΅œμ‹  formatter와 곡백 ν˜•μ‹μ΄ 달라, ꡬ쑰체 곡백과 λ¬Έμ„œ μ£Όμ„μ˜ μ€„λ°”κΏˆΒ·λ“€μ—¬μ“°κΈ°λ§Œ μ •κ·œν™”ν•œ 두 번째 μ•žλΆ€λΆ„μ„ λ³„λ„λ‘œ κ³ μ •ν–ˆμŠ΅λ‹ˆλ‹€. κΈ°μ‘΄ μ½”λ“œμ˜ μ˜λ―Έμ™€ μ €μž‘κΆŒ ν‘œκΈ°λŠ” κ·ΈλŒ€λ‘œμž…λ‹ˆλ‹€. μƒˆ ν•¨μˆ˜λŠ” 둜컬 κ°’Β·λ°˜λ³΅λ¬Έ, μ›λ³Έμ˜ μˆœμˆ˜ν•œ Parse/xtob, 일뢀 순수 ν‘œμ€€ ν•¨μˆ˜μ™€ λ³€ν™˜λ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚œμˆ˜Β·μ „μ—­ μƒνƒœ μ“°κΈ°, μ „μ—­ λ°°μ—΄μ˜ 별칭, ν•¨μˆ˜ 별칭을 ν†΅ν•œ 호좜, ν•¨μˆ˜ λ¦¬ν„°λŸ΄, 포인터, λ™μ‹œμ„±, 별도 helper, 원본 API·헀더 νŽΈμ§‘μ€ 지원 λ²”μœ„ λ°–μž…λ‹ˆλ‹€.

지원 λ²”μœ„ λ°– μ½”λ“œλŠ” verifier_unknown으둜 λ‚¨κΉλ‹ˆλ‹€. λ™μž‘μ΄ λ§žλŠ” λ²”μš© κ΅¬ν˜„λ„ 이 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ λͺ¨λΈμ˜ μ‹€νŒ¨λ‘œ μ„Έμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” Go 전체λ₯Ό λΆ„μ„ν•˜λŠ” λ²”μš© 효과 검증기가 μ•„λ‹ˆλΌ, μž‘μ€ 곡개 μž‘μ—…μ—μ„œ κ²€μ¦ν•˜μ§€ λͺ»ν•œ κ΅¬ν˜„μ„ μ•ˆμ „ν•˜κ²Œ κ΅¬λΆ„ν•˜λŠ” μ œν•œμž…λ‹ˆλ‹€. 둜컬 λ³€μˆ˜ κ²€μ‚¬λŠ” μ΄λ¦„λ§Œ λΉ„κ΅ν•˜μ§€ μ•Šκ³  μ„ μ–Έ 객체λ₯Ό μΆ”μ ν•˜μ—¬, μ•ˆμͺ½ λΈ”λ‘μ˜ 같은 μ΄λ¦„μœΌλ‘œ μ „μ—­ μƒνƒœ μ“°κΈ°λ₯Ό μˆ¨κΈ°λŠ” κ²½μš°λ„ κ±°λΆ€ν•©λ‹ˆλ‹€.

독립 검사와 개발 λŒ€μ‘°κ΅°

후보가 μ“΄ ν…ŒμŠ€νŠΈλŠ” 수용 근거둜 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 원본 ν…ŒμŠ€νŠΈμ™€ λ³„λ„λ‘œ λ‹€μŒ μ—¬μ„― 검사λ₯Ό μ‹ λ’°ν•œ μ™ΈλΆ€ ν…ŒμŠ€νŠΈ νŒ¨ν‚€μ§€μ—μ„œ κ³΅κΈ‰ν•©λ‹ˆλ‹€.

  1. 0Β·μ΅œλŒ“κ°’Β·μΌλ°˜ κ°’Β·λΉ„νŠΈ μ œμ•½μ΄ μ—†λŠ” κ³ μ • μž…λ ₯의 μ •ν™•ν•œ 16λ°”μ΄νŠΈ κ²°κ³Ό.
  2. 36개 μœ„μΉ˜ κ°κ°μ—μ„œ κ°€λŠ₯ν•œ λ°”μ΄νŠΈ 256개λ₯Ό λ°”κΎΈλŠ” 9,216κ°€μ§€ 검사. κΈ°λŒ€κ°’μ€ 직접 μ •μ˜ν•œ 문자 κ·œμΉ™κ³Ό ν‘œμ€€ encoding/hex둜 계산.
  3. λŒ€λ¬ΈμžΒ·URNΒ·μ›μ‹œ ν˜•μ‹Β·ν¬μž₯Β·κ³΅λ°±Β·μœ λ‹ˆμ½”λ“œΒ·μž˜λͺ»λœ 길이 κ±°λΆ€.
  4. λ’€μͺ½ 잘λͺ»λœ λ°”μ΄νŠΈμ—μ„œλ„ 였λ₯˜μ™€ 0 UUID λ°˜ν™˜.
  5. κΈ°μ‘΄ Parse/ParseBytes의 ν—ˆμš© ν˜•μ‹κ³Ό 였λ₯˜ μ’…λ₯˜ 보쑴.
  6. λ°˜λ³΅Β·λ™μ‹œ 호좜의 κ²°κ³Ό, μ„€μ •ν•œ λ‚œμˆ˜ reader 보쑴, random pool의 λ‚΄μš©Β·μœ„μΉ˜Β·μ‚¬μš© μ„€μ • 보쑴.

λ‚œμˆ˜ reader κ΄€μΈ‘λ§ŒμœΌλ‘œ λͺ¨λ“  κ°€λŠ₯ν•œ λ‚œμˆ˜ 접근을 증λͺ…ν•œλ‹€κ³  μ£Όμž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. crypto/rand.Read 직접 호좜 같은 κ²½λ‘œλŠ” 쒁은 κ΅¬ν˜„ ν˜•νƒœ κ²€μ‚¬μ—μ„œλ„ κ±°λΆ€ν•©λ‹ˆλ‹€. 이쀑 ν™•μΈμ˜ λ²”μœ„λŠ” 이번 지원 ν˜•νƒœμ™€ μ‹œν—˜ν•œ μž…λ ₯μž…λ‹ˆλ‹€.

Go 1.27.1 / macOS arm64μ—μ„œ κ²©λ¦¬Β·λ„€νŠΈμ›Œν¬ 차단 ν™˜κ²½μœΌλ‘œ μ‹€μ œ ν™•μΈν•œ 개발 κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • κ³ μ • μ›λ³Έμ˜ 전체 Go ν…ŒμŠ€νŠΈλŠ” terminal pass 212개λ₯Ό κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ ν˜ΈμŠ€νŠΈκ°€ μ„ νƒν•œ build 파일 λ²”μœ„μ˜ 싀행이며, λͺ¨λ“  ν”Œλž«νΌΒ·μ™ΈλΆ€ 톡합 μ‹œν—˜μ΄ ν†΅κ³Όν–ˆλ‹€λŠ” λœ»μ€ μ•„λ‹™λ‹ˆλ‹€.
  • κ·ΈλŒ€λ‘œμΈ μ›λ³Έμ—λŠ” μƒˆ APIκ°€ μ—†μ–΄ 독립 계약이 μ‹€νŒ¨ν•©λ‹ˆλ‹€.
  • 직접 μž‘μ„±ν•œ μ •λ‹΅ λŒ€μ‘° κ΅¬ν˜„μ€ 원본 212κ°œμ™€ 독립 검사 6개λ₯Ό λͺ¨λ‘ ν†΅κ³Όν–ˆμŠ΅λ‹ˆλ‹€.
  • 지원 ν˜•νƒœ μ•ˆμ—μ„œ 잘λͺ»λœ κ΅¬ν˜„ 14쒅은 각각 독립 검사 6κ°œκ°€ μ‹€μ œ μ’…λ£Œν•˜κ³  였λ₯˜λ₯Ό κ²€μΆœν–ˆμŠ΅λ‹ˆλ‹€. 컴파일 μ‹€νŒ¨λ₯Ό 의미 검사 μ„±κ³΅μœΌλ‘œ μ„Έμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 지원 ν˜•νƒœ λ°–μ˜ λŒ€μ‘°κ΅° 21쒅은 λ³„λ„λ‘œ 검사해 κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€. 원본 ν‘œκΈ° μ‚­μ œ, 직접 λ‚œμˆ˜ μ ‘κ·Ό, μ „μ—­ λ³€κ²½, ν•¨μˆ˜ 별칭 호좜, helper 좔가와 블둝 shadowλ₯Ό μ΄μš©ν•œ μ „μ—­ μ“°κΈ° 등을 ν¬ν•¨ν•©λ‹ˆλ‹€. 이듀은 λ‚œμ΄λ„Β·μ„±κ³΅λ₯  라벨이 μ•„λ‹™λ‹ˆλ‹€.
  • 쀑앙 검증기λ₯Ό ν†΅ν•œ 톡합 μ‹œν—˜μ—μ„œ 후보가 μ“΄ 잘λͺ»λœ ν…ŒμŠ€νŠΈλ₯Ό λ¬΄μ‹œν•˜κ³  정닡을 μˆ˜μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ³„λ„μ˜ κ²€ν† μžκ°€ 독립 κ΅¬ν˜„μœΌλ‘œ CLIλ₯Ό μ‹€ν–‰ν•œ 5개 λŒ€μ‘°κ΅°μ—μ„œλ„ μ •λ‹΅ 수용, λŒ€λ¬Έμžλ₯Ό ν—ˆμš©ν•˜λŠ” 였λ₯˜ κ²€μΆœ, 직접 λ‚œμˆ˜Β·λΈ”λ‘ shadow μ „μ—­ μ“°κΈ°Β·μ €μž‘κΆŒ 헀더 μ‚­μ œμ˜ unknown ꡬ뢄을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
  • 이 μž‘μ—…μ˜ 전체 race 검사, 정적 검사, κΈ°μ‘΄ μž‘μ—… λͺ…μ„Έ ν•΄μ‹œ 보쑴 검사도 λ‘œμ»¬μ—μ„œ ν†΅κ³Όν–ˆμŠ΅λ‹ˆλ‹€. 곡개 CI와 μ‹€μ œ λͺ¨λΈ 싀행은 별도 기둝으둜 확인해야 ν•©λ‹ˆλ‹€.

9,216개 μž…λ ₯ 검사와 μ—¬λŸ¬ λŒ€μ‘°κ΅°μ€ μ„œλ‘œ λ‹€λ₯Έ λͺ¨λΈ μž‘μ—… μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€. 이 κ³„μ•½μ˜ μ˜λ―Έμƒ μž‘μ—…μ€ ν•˜λ‚˜μ΄λ©° λͺ¨λΈ 싀행은 0νšŒμž…λ‹ˆλ‹€. 120개 전체λ₯Ό μ‹€ν–‰Β·ν•™μŠ΅Β·μ΅œμ’… 평가에 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€κ³  μ„ μ–Έν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‹€μ œ λͺ¨λΈ μ‹œν—˜μ€ κ³„μ•½Β·μ›μ²œΒ·μ‹€ν–‰ 방식이 κ³ μ •λœ λ’€ 별도 κ³„νšκ³Ό 결과둜 기둝해야 ν•©λ‹ˆλ‹€.