2014-07-10 3 views
3

내 시스템에서 URL 안전성을 나타내는 고유 ID를 만들려면 SecureRandom.urlsafe_base64(8)을 사용하고 있습니다.Ruby에서 SecureRandom.urlsafe_base64 (8) 충돌 가능성이 있습니까?

충돌 가능성을 계산하는 방법을 알고 싶습니다. 배열에 약 10.000 개의 ID를 삽입하려고합니다. 키 중 하나가 이미 배열에 있는지 확인하지 않으려 고합니다. 그러나 반복되지 않도록하고 싶습니다. 기회는 무엇입니까?

답변

11

이 확률에 대한 좋은 근사값이 있습니다 (birthday problem과 관련 있음). 이 k 전위 값이며 n 샘플링하는 경우, 충돌 확률은 다음

k!/(k^n * (k - n)!) 

base64 방법은 임의의 바이트의 입력 번호가 아닌 임의의 자릿수의 숫자로 만들어진베이스 (64) 스트링을 반환한다. 8 개의 임의의 바이트는 k = 256^8, 약 1.8446744e+19이됩니다. 10,000 개의 문자열을 생성하므로 n = 10,000은 매우 낮은 숫자 인 2.710498492319857e-12을 제공합니다.

5

확률을 계산하여을 확인하십시오. 가능성이 얼마나 높은지 알 수 있습니다.

자신을 보호하려면 데이터베이스 열에 고유 색인을 추가하십시오. 이렇게하면 데이터베이스에 중복 된 데이터를 저장할 수 없습니다. 이 매우 가능성 (@ AndrewPilser의 대답 참조) 이벤트가 발생할 때 삽입 삽입 ActiveRecord::InvalidStatement 오류가 발생합니다.

+1

아주 좋은 지적입니다! "아마"확신 할 필요가 있다면 확률은 중요하지 않으며 유효성 검사가 필요합니다. –