/dev/urandom의 중복 숫자 수가 모든 시스템에서 동일한 이유는 무엇입니까?

/dev/urandom의 중복 숫자 수가 모든 시스템에서 동일한 이유는 무엇입니까?

이 명령은 숫자를 생성 /dev/urandom하고 중복된 항목 수를 인쇄하여 모든 시스템에서 동일한 결과를 반환합니다. 왜?

dd if=/dev/urandom count=1 bs=5M 2> /dev/null | od - | cut -d " " -f 2- | sed s/" "/"\n"/g | sort -n | uniq -d | wc -l

다음은 이 명령을 실행하는 모든 시스템에서 256^2(16비트 상한), UNIX 시스템의 포트 수 또는 다른 아키텍처를 포함하여 단지 65536을 반환하는 명령입니다.

이상한 점은 각 숫자가 6자리인데, 5M이라도 데이터 덤프가 가능한 숫자 수보다 훨씬 크다는 점~숫자가 반복되지 않을 가능성은 매우 적습니다.

가능한 숫자의 수: 100000(00000-99999이기 때문에)

데이터 덤프의 행(5M): 2621441

약 1M보다 큰 데이터 세트에 대해 동일한 결과를 인쇄합니다.

출력에서 임의의 숫자(예: 045765)를 찾으면 매번 다른 숫자가 35~47번 표시됩니다.

나는 숫자를 계산하기 위해 작은 Python 스크립트를 작성했습니다. 단 하나만 고유하지 않았지만 더미의 마지막 숫자였습니다. 아마도 EOF 때문일 것입니다. 데이터 덤프를 인쇄할 때 항상 나머지 숫자보다 길고 맞지 않으므로 무시할 수 있습니다. 65536개 이상의 고유번호가 있음을 증명하기 위해 2621441줄을 사용하여 고유한 숫자가 없음을 증명합니다.

어떻게 이런 일이 발생했는지 이해할 수 없습니다. 명령의 일부 구성 요소에 버그가 있는 것 같습니다.

어떻게 이런 일이 일어나는지 설명할 수 있는 사람이 있나요?

답변1

한 단어: 8진수.

인쇄되는 것은 숫자가 있는 곳 부터 od입니다 . 이러한 문자열은 서로 다른 방식으로 인코딩된 2바이트 값일 뿐입니다. 다른 인코딩은 65536개의 가능성이 있다는 사실을 바꾸지 않습니다. 충분히 큰 무작위 데이터 세트에서 이 모든 것을 얻을 수 있습니다.0000001777770..7

"숫자로" 계산하더라도 모든 것이 맞습니다. 8진수를 올바르게 사용하면 됩니다. 당신의 시도:

가능한 숫자의 수: 100000(00000-99999이기 때문에)

소수점으로 가정됩니다. 올바른 방법은 다음과 같습니다.

  • 첫 번째 문자는 0또는 1, (2가지 가능성)입니다.
  • 그런 다음 5개의 문자가 있습니다 0..7(각 문자에 대해 8개의 가능성).

2×8 5 = 2 16

관련 정보