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:2文字を読みます(ここにはLC_ALL = Cのバイトがあります)。既にこれのためにksh93今。キーボードキーを参照しないで、同じでなければなりません。bash-N-u0ksh-k
  • (s::)分割するパラメータ拡張フラグ(ここでは空の文字列なので単一文字に分割されています)
  • $^array:この配列を割り当てて拡張するとなります'x 'y
  • ここでは、文字のコードポイント値を取得する部分を含むコマンドがprintf標準です。'x

関連情報