상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[JAVA] Random vs SecureRandom vs ThreadLocalRandom

😎 지식 in Action/Java & Kotlin

by :ν•΄ν”Όλž˜λΉ—πŸΎ 2024. 12. 26. 12:42

λ³Έλ¬Έ

λ‚œμˆ˜

λ‚œμˆ˜λŠ” λ¬΄μž‘μœ„μ„±, 예츑 λΆˆκ°€λŠ₯μ„±, μž¬ν˜„ λΆˆκ°€λŠ₯μ„± μ„±μ§ˆμ΄ μžˆλ‹€. 

λ¬΄μž‘μœ„μ„±μ΄λž€ μˆ˜μ—΄μ˜ λΉ„νŠΈ 뢄포가 κ· λ“±ν•˜κ³  0κ³Ό 1이 λ“±μž₯ν•˜λŠ” λΉˆλ„κ°€ λΉ„μŠ·ν•œ 것을 μ˜λ―Έν•œλ‹€. 

예츑 λΆˆκ°€λŠ₯μ„±μ΄λž€ μˆ˜μ—΄μ˜ 일뢀λ₯Ό 보고 λ‹€μŒ λΉ„νŠΈλ₯Ό μ˜ˆμƒν•  수 μ—†μ–΄μ•Ό 함을 μ˜λ―Έν•œλ‹€.

μž¬ν˜„ λΆˆκ°€λŠ₯μ„±μ΄λž€ 같은 μˆ˜μ—΄μ„ λ˜‘κ°™μ΄ μž¬ν˜„ν•  수 μ—†λ‹€λŠ” μ„±μ§ˆμ΄λ‹€. μ΄λŠ” ν•˜λ“œμ›¨μ–΄λ„ λ™μ›λ˜μ–΄μ•Ό ν•œλ‹€. 

 

λ¬΄μž‘μœ„μ„±λ§Œ κ°€μ§€λŠ” λ‚œμˆ˜λ₯Ό μ•½ν•œ μ˜μ‚¬ λ‚œμˆ˜, 예츑 λΆˆκ°€λŠ₯성을 κ°€μ§€λŠ” λ‚œμˆ˜λ₯Ό κ°•ν•œ μ˜μ‚¬ λ‚œμˆ˜, μž¬ν˜„ λΆˆκ°€λŠ₯성을 κ°€μ§€λŠ” λ‚œμˆ˜λ₯Ό μ§„μ„± λ‚œμˆ˜λΌκ³  ν•œλ‹€. 

 

 

 

μ§„μ„± λ‚œμˆ˜(True Random Number)와 μ˜μ‚¬ λ‚œμˆ˜(μœ μ‚¬λ‚œμˆ˜; Pseudorandom Number)

μ§„μ„± λ‚œμˆ˜λž€ μžμ—°μ μ΄κ³  예츑 λΆˆκ°€λŠ₯ν•œ 물리적 ν˜„μƒ(μ—”νŠΈλ‘œν”Ό μ†ŒμŠ€)μ—μ„œ μƒμ„±λœ λ‚œμˆ˜λ‘œ μ™„μ „νžˆ λžœλ€ν•˜κ³  μž¬ν˜„μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€. 

ν•˜λ“œμ›¨μ–΄ λ‚œμˆ˜ 생성기(HRNG; Hardware Random Number Generator)와 같이 물리적 μž₯치λ₯Ό μ‚¬μš©ν•΄ λ‚œμˆ˜λ₯Ό μƒμ„±ν•œλ‹€.

 

μ˜μ‚¬λ‚œμˆ˜λž€ μ•Œκ³ λ¦¬μ¦˜μ— μ˜ν•΄ μƒμ„±λœ λ‚œμˆ˜λ‘œ λ‚œμˆ˜μ²˜λŸΌλ³΄μ΄μ§€λ§Œ

μ•Œκ³ λ¦¬μ¦˜μ˜ μƒνƒœμ— μ˜ν•΄ 값이 μ •ν•΄μ§€λ―€λ‘œ μƒμ„±λœ μˆ˜μ—΄μ€ μΌμ •ν•œ μ£ΌκΈ°λ₯Ό κ°€μ§€λ©°, λ”°λΌμ„œ λ‚œμˆ˜μ˜ 예츑 λΆˆκ°€λŠ₯성을 κ°€μ§ˆ 수 μ—†λ‹€.

λ™μΌν•œ Seedλ₯Ό μ•Œλ©΄ 예츑이 κ°€λŠ₯ν•˜λ‹€. SeedλŠ” λ‚œμˆ˜ λ˜λŠ” μ˜μ‚¬λ‚œμˆ˜μ–΄μ•Ό ν•œλ‹€. 

μ˜μ‚¬λ‚œμˆ˜ 생성기(PRNG; Rseudorandom Number Generator)λ₯Ό 톡해 μƒμ„±ν•œλ‹€.

 

좜처 : 

더보기

 

http://www.parkjonghyuk.net/lecture/2021-1st-lecture/information-protect/chap13.pdf

https://velog.io/@cjy/%EB%82%9C%EC%88%98

λ„€νŠΈμ›Œν¬λ³΄μ•ˆ μ—μ„Όμ…œ

 

μœ μ‚¬λ‚œμˆ˜ : 일반적인 ν”„λ‘œλͺ¨μ…˜ 쿠폰, λŒ€λŸ‰ 배포가 ν•„μš”ν•œ μƒν™©μ—μ„œ μ‚¬μš©ν•˜λ©° λΉ λ₯΄κ³  효율적으둜 μ½”λ“œλ₯Ό 생성할 수 μžˆλ‹€.

μ§„μ„±λ‚œμˆ˜ : κ³ κ°€ μƒν’ˆ, VIP λŒ€μƒ 쿠폰, 쿠폰 생성 μ•Œκ³ λ¦¬μ¦˜μ΄ 역곡학될 μœ„ν—˜μ„ μ΅œμ†Œν™”ν•œλ‹€. 


Random

λ””ν΄νŠΈ μ‹œλ“œκ°’μœΌλ‘œ μ‹œμŠ€ν…œμ˜ ν˜„μž¬ μ‹œκ°„μ„ ν™œμš©ν•œλ‹€.

μŠ€λ ˆλ“œ μ•ˆμ „ν•˜μ§€λ§Œ, μ—¬λŸ¬ μŠ€λ ˆλ“œμ—μ„œ λ™μ‹œμ— Random μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ 경합이 λ°œμƒν•˜μ—¬ μ„±λŠ₯이 μ €ν•˜λ  수 μžˆλ‹€. 

λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ ThreadLocalRandom을 μ‚¬μš©ν•˜λŠ” 것을 고렀해봐야 ν•œλ‹€.μ•”ν˜Έν•™μ μœΌλ‘œ μ•ˆμ „ν•˜μ§€ μ•ŠκΈ°μ— λ³΄μ•ˆμ— λ―Όκ°ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ•”ν˜Έν•™μ μœΌλ‘œ μ•ˆμ „ν•œ SecureRandom을 μ‚¬μš©ν•˜λŠ” 것을 고렀해봐야 ν•œλ‹€. 

 

 

SecureRandom

μ•”ν˜Έν™”μ μœΌλ‘œ κ°•λ ₯ν•œ λ‚œμˆ˜ 생성기 (RNG)을 μ œκ³΅ν•œλ‹€.

톡계적 λ‚œμˆ˜ 생성기 ν…ŒμŠ€νŠΈλ₯Ό μ€€μˆ˜ν•œλ‹€.

즉, SecureRandom에 μ „λ‹¬λœ λͺ¨λ“  μ‹œλ“œ μžλ£ŒλŠ” μ˜ˆμΈ‘ν•  수 μ—†μ–΄ ν•˜λ©° 좜λ ₯ μ‹œν€€μŠ€λŠ” μ•”ν˜Έν™”μ μœΌλ‘œ κ°•λ ₯ν•΄μ•Ό ν•œλ‹€. 

 

 

 

ThreadLocalRandom

μŠ€λ ˆλ“œμ—μ„œ 격리된 λ‚œμˆ˜ μƒμ„±κΈ°λ‘œ ThreadLocalRandom λ‚΄λΆ€μ μœΌλ‘œ μƒμ„±λœ μ‹œλ“œλ‘œ μ΄ˆκΈ°ν™”λ˜λ©° λ‹€λ₯Έ λ°©λ²•μœΌλ‘œλŠ” μˆ˜μ •λ  수 μ—†λ‹€. 

import java.util.concurrent.ThreadLocalRandom;
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);

μ—¬λŸ¬ μž‘μ—…(예: 각 a ForkJoinTask)이 μŠ€λ ˆλ“œ ν’€μ—μ„œ λ³‘λ ¬λ‘œ λ‚œμˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 특히 μ ν•©ν•˜λ‹€.

μ•”ν˜Έν•™μ μœΌλ‘œ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€. 

728x90

κ΄€λ ¨κΈ€ 더보기