셸 스 크 립 트 는 난수 다양한 방법 소개 (date, random, uid)

6291 단어
일상생활 에서 랜 덤 수 는 실제로 자주 만 나 는데 주사 위 를 던 지고 제 비 뽑 기, 그리고 제 비 뽑 기 를 하고 싶 습 니 다.허허, 아주 간단 해.그럼 프로 그래 밍 을 하고 있 습 니 다. 정말 자신의 프로 그래 밍 을 통 해 랜 덤 수 를 만들어 야 합 니 다. 그것 은 정말 쉽 지 않 습 니 다.현재 많은 것 이 운영 체제 커 널 에서 해당 하 는 api 를 제공 합 니 다. 이런 원시 적 인 매개 변 수 는 메모리, 전압, 물리 신호 등 컴퓨터 가 원 초적 인 정 보 를 실행 하 는 것 입 니 다. 그의 값 은 한 시간 동안 유일한 것 이 라 고 보장 할 수 있 습 니 다.됐어, 쓸데없는 소리 안 할 게.하하.
셸 스 크 립 트 프로그램 은 무 작위 숫자 를 얻 는 방법 이 있 습 니까?
1. 시간 을 통 해 난수 획득 (date)
이것 도 우리 가 자주 사용 하 는 것 입 니 다. 시간 이 유일한 것 이 라 고 할 수 있 고 중복 되 지 않 습 니 다. 이 안에서 같은 시간의 유일한 값 을 얻 을 수 있 습 니 다. 모든 프로그램 에 적 응 했 습 니 다.
예:
 
  
[chengmo@centos5  shell]$ date +%s
1287764773
# , :1970-01-01 00:00:00
# , 。 , 。
 
[chengmo@centos5  shell]$ date +%N
738710457
# , 。
# , cpu, , , ,
 
[chengmo@centos5  shell]$ date +%s%N
1287764807051101270
# , ,

위의 설명 을 통 해 랜 덤 수의 기 수 를 만 들 었 습 니 다. 다음 에 우 리 는 데이터 에서 어떻게 랜 덤 수 를 얻 는 지 보 겠 습 니 다.
 
  
#!/bin/sh
 
# , random min max
# min max
#copyright chengmo QQ:8292669
 
 
# ,shell ,
function random()
{
    min=$1;
    max=$2-$1;
    num=$(date +%s+%N);
    ((retnum=num%max+min));
    #
    echo $retnum;
    # echo , ,stdout
    # , , ,
}
 
# 1-10 seq
for i in {1..10};
do
    out=$(random 2 10000);
    echo $i,"2-10000",$out;
done;

실행 결과 보기:
 
  
[chengmo@centos5  shell]$ sh testrandom.sh
1,2-10000,5600
2,2-10000,5295
3,2-10000,3432
4,2-10000,3148
5,2-10000,9041
6,2-10000,4290
7,2-10000,2380
8,2-10000,9009
9,2-10000,5474
10,2-10000,3664

하나의 순환 안에서 얻 는 값 은 각각 다르다.
이것 은 우리 가 자주 사용 하 는 방법 입 니 다. 각종 언어 에 적응 하 는 통용 알고리즘 입 니 다. 서버 가 제공 하지 않 더 라 도 언제든지 똑 같은 유일한 데이터 표 시 를 할 수 있 습 니 다. 우 리 는 이런 방법 을 통 해 자신의 위조 랜 덤 수 를 만 들 수 있 습 니 다. 다음은 더 간단 한 방법 이 있 습 니 다. 우리 가 하지 마 세 요.
2. 내부 시스템 변 수 를 통 해 ($RANDOM)
사실은 Liux 는 시스템 환경 변 수 를 제 공 했 습 니 다. 바로 랜 덤 수 입 니 다. 하하, 방금 배 운 방법 이 헛 된 것 같 습 니 다!!
 
  
[chengmo@centos5  shell]$ echo $RANDOM
10918
[chengmo@centos5  shell]$ echo $RANDOM
10001
 
# 2 , , 5

의문 이 생 겼 을 수도 있 습 니 다. 5 위 를 넘 으 면 무 작위 수 는 어떻게 얻 나 요?
하하, 고정 10 자리 정 수 를 넣 고 나머지 를 구 하 는 것 은 예 1 과 같 습 니 다. 다음 예 는 우리 가 자립 하여 갱생 한 것 입 니 다.
3. 시스템 내부 의 유일한 데 이 터 를 통 해 난수 생 성 (/dev/random, urandom)
dev 디 렉 터 리 아래 는 Liux 의 기본 장치 라 는 것 을 알 고 있 습 니 다. 키보드, 하 드 디스크, 시디롬 등 장치 에 대응 하 는 파일 을 놓 은 것 처럼 느껴 집 니 다. 사실 Liux 의 일부 장 치 는 매우 특수 하고 특수 한 용도 가 있 습 니 다. 앞에서 말 한 것 은/dev/[udp | tcp]/host/port 가 비교적 특수 하 죠? 하하, 멀 어 졌 습 니 다.
/dev/random 장 치 는 시스템 이 현재 실행 중인 환경의 실시 간 데 이 터 를 저장 합 니 다. 시스템 의 어느 때 유일한 값 데이터 로 볼 수 있 기 때문에 랜 덤 데이터 로 사용 할 수 있 습 니 다. 파일 읽 기 방식 으로 데 이 터 를 읽 을 수 있 습 니 다./dev/urandom 이 장치 데 이 터 는 random 과 같 습 니 다. 다만, 막 히 지 않 는 랜 덤 발생 기 입 니 다. 읽 기 동작 은 random 과 같 지 않 습 니 다.차단 이 생 길 수 있 습 니 다.
실례:
 
  
[chengmo@centos5  shell]$ head -1 /dev/urandom
ãņù…•KTþçanVÕã¹Û&¡õ¾“ô2íùU“ žF¦_ ÿ”†mEðûUráÏ=J¯TŸA•ÌAÚRtÓ
 
# , ? , ?
 
 
[chengmo@centos5 ~/shell]$ head -200 /dev/urandom | cksum
1615228479 50333
# urandom , cat , 200 , , 。
#cksum , , , , php crc
 
[chengmo@centos5  shell]$ head -200 /dev/urandom | cksum | cut -f1 -d" "
484750180
#cut ” “ ,

전체 데 이 터 를 얻 은 후에 유사 한 방법 으로 무 작위 수 를 얻 을 수 있 습 니 다.자세히 알 고 싶 으 면 참고 할 수 있 습 니 다: crc.
장치 에서 직접 읽 어 좋 은 uid 코드 를 만 드 는 방법 도 있 습 니 다.
4. Liux 의 uid 코드 읽 기
이것 을 언급 하기 전에 개념 이 있 습 니 다. 바로 uid 가 무엇 입 니까?
UUID 코드 는 모두 통용 되 는 유일한 식별 코드 (Universally Unique Identifier, UUID) 로 소프트웨어 구축 의 기준 이자 자유 소프트웨어 재단 (Open Software Foundation, OSF) 의 조직 이 분포 식 컴 퓨 팅 환경 (Distributed Computing Environment, DCE) 분야 의 일부분 이다.
UUID 의 목적 은 분포 식 시스템 의 모든 요 소 를 중앙 제어 단 을 통 해 정 보 를 식별 할 필요 가 없 는 유일한 식별 정 보 를 가 질 수 있 도록 하 는 것 입 니 다. 이렇게 되면 모든 사람 이 다른 사람과 충돌 하지 않 는 UUID 를 만 들 수 있 습 니 다. 이러한 상황 에서 데이터 베 이 스 를 만 들 때의 이름 중복 문 제 를 고려 하지 않 아 도 됩 니 다. 네트워크 의 모든 컴퓨터 에 생 성 될 수 있 습 니 다.이 루어 진 uid 코드 는 모두 인터넷 전체 서버 네트워크 에서 유일한 것 입 니 다. 원래 의 정 보 는 하드웨어, 시간, 기계 의 현재 운행 정보 등 을 추가 합 니 다.
UUID 형식 은 16 진수 32 개 를 포함 하고 "-"연결 번 호 를 5 단 으로 나 누 며 형식 은 8 - 4 - 4 - 12 의 32 글자 입 니 다. 범례; 550 e8400 - e29b - 41d4 - a716 - 446655440000  ,따라서 UUID 이론 상의 총 수 는 216 x 8 = 2128 로 약 3.4 x 1038 과 같다. 즉, 네 초 에 1 조 개의 UUID 가 발생 하면 100 억 년 이 걸 려 야 모든 UUID 를 다 쓸 수 있다 는 것 이다.
사실, 여러분 이 데이터베이스 디자인 을 할 때, 틀림없이 들 어 본 적 이 있 을 것 입 니 다. guid (전역 유일한 식별 자) 코드 는 사실 uid 와 유사 합 니 다. 마이크로소프트 가 지원 합 니 다. 여기 인 코딩 은 기본적으로 운영 체제 커 널 이 있 습 니 다. windows 에 서 는 데이터베이스 든 다른 소프트웨어 든 이 uid 인 코딩 을 쉽게 얻 을 수 있 습 니 다.
linux 의 uid 코드
Liux 의 uid 코드 도 커 널 에서 제공 합 니 다./proc/sys/kernel/random/uid 파일 에 있 습 니 다. 사실 random 디 렉 터 리 에는 다른 파일 도 많이 있 습 니 다. uid 생 성 과 관련 이 있 습 니 다.
 
  
[chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid
dff68213-b700-4947-87b1-d9e640334196
[chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid
7b57209a-d285-4fd0-88b4-9d3162d2e1bc
# 2 , uuid
 
[chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid| cksum | cut -f1 -d" "
2141807556
#

이것 은 Liux 아래 에서 흔히 볼 수 있 는 활동 의 난수 정수 방법 입 니 다. 첫 번 째 가 다른 것 을 제외 하고 사실은 세 개 입 니 다. 랜 덤 코드 가 발생 하 는 가짜 데이터 출처 는 모두/dev/random 장치 와 관계 가 있 습 니 다. 다만 각각 다른 방법 을 보 여 주 었 을 뿐 입 니 다. 더 많은 방법 이 있다 면 저 에 게 소식 을 주 십시오. 여러분 과 공유 하 십시오.

좋은 웹페이지 즐겨찾기