MAC 주소 생성 성능을 향상시키는 방법은 무엇입니까?

MAC 주소 생성 성능을 향상시키는 방법은 무엇입니까?

내 스크립트에서는 MAC 주소를 무작위로 생성해야 합니다. 아래 코드는 더 큰 스크립트에서 추출되었으므로 MAC 주소 계산이 별도의 함수에 있습니다.

이는 아래 코드와 잘 작동합니다. 스크립트를 실행하면 여러 주소를 생성한 후 속도가 크게 느려집니다.

내가 어떻게 할 수있는가속하다유효한 MAC 주소를 생성하시겠습니까?

#!/bin/bash

devicesCSVMacAddress="55:2d:fa:07" # <- fake MAC address prefix
devicesCSVFile=''

function mac_address() {
    line=''


    # ****************
    # This line below when I calculate a random mac address ending seems to be slow
    line+=$devicesCSVMacAddress$(od -txC -An -N2 /dev/random|tr \  :)
    # ****************


    devicesCSVFile+=$line'\n'
    date
}

for (( i=0; i<100; i++ ))
do
    mac_address
    echo $i
done

echo -e $devicesCSVFile > devices.csv

이 답변에 설명된 대로 od 도구를 사용했습니다.Bash 쉘을 사용하여 유효한 임의 MAC 주소를 생성하는 방법.

답변1

사용 /dev/urandom! 사용해야 할 몇 가지 이유가 있습니다 /dev/random. /dev/urandom참조우랜덤에 관한 신화또는/dev/random과 /dev/urandom을 사용하는 경우-- 생성된 숫자를 모든 곳에 게시하는 경우에는 확실히 그렇지 않습니다.

/dev/random사용 가능한 엔트로피가 충분하지 않으면 엔트로피를 소비하고 차단하고 대기합니다. /dev/urandom절대 차단하지 마세요.

답변2

이렇게 하면 원하는 무작위성을 유지하면서 중복을 피할 수 있습니다.

prefix='55:2a:fa:07'
while :
do
    echo $prefix$(od -txC -An -N2 /dev/urandom | tr ' ' :)
done |
    awk '!h[$0]++ {print $0; ONR++} ONR>100 {exit}' >devices.csv

awk구성은 이미 본 행을 추적하고 이전에 본 적이 없는 행만 출력합니다. 100줄을 인쇄하면 종료되고 루프가 중지됩니다.

답변3

그리고 zsh:

#! /bin/zsh -
prefix=55:2d:fa:07

(){
  local LC_ALL=C
  IFS= read -ru0 -k2 a < /dev/urandom
  printf '%s:%02x:%02x\n' "$prefix" \'${^(s::)a}
}

내장된 기능만 사용됩니다. zsh특정 기능은 다음과 같습니다.

  • (다른 모든 쉘과 달리) 변수에서 NUL 바이트를 처리할 수 있습니다.
  • (){...}: 익명 함수(여기서는 LC_ALL의 로컬 범위에서 사용됨)
  • read -k2: 두 문자를 읽습니다(여기에는 LC_ALL=C인 바이트가 있습니다). 이미 이것 을 위해 ksh93지금 . 키보드 키를 참조하지 말고 ( 와 ) 동일 해야 합니다 .bash-N-u0ksh-k
  • (s::)분할할 매개변수 확장 플래그(여기서는 빈 문자열이므로 단일 문자로 분할됨)
  • $^array: 이 배열을 할당하여 확장하면 가 됩니다 'x 'y.
  • 여기서는 문자의 코드 포인트 값을 가져오는 부분을 포함하여 명령 printf이 표준입니다 .'x

관련 정보