生成一个独特的' 4个十六进制数字的3个字符标记

时间:2015-02-20 06:54:10

标签: linux bash raspberry-pi unique-key

我正在为当地博物馆的无状态网络启动环境中使用Raspberry Pi开展一个项目。我希望Raspberry Pi从MAC地址的最后4位数生成易于记忆的3个字符代码。此代码将由一个人读取并输入到描述机器将执行操作的数据库中,并且在将来重新启动时,Raspberry Pi将查找其自己的代码以识别其任务。

可以单独使用部分MAC地址完成,但我希望生成更人性化的代码以减少错误。转换只需要在一个方向上工作。

我认为我已将其分解为逻辑步骤,但我不确定如何以有效的方式实现它们。

  1. 从MAC地址中取出最后4个字符
  2. 转换为二进制 - 16位
  3. 删除MSB以留下15位
  4. 颠倒比特的顺序 - 在我看来,这会使角色随机化一点,使最终的字符串更难忘。
  5. 将15位分成3个5位
  6. 的块
  7. 将每个5位块映射到跳过I,1,O&的字母/数字。 0以避免混淆
  8. 输出3个字符的字符串

2 个答案:

答案 0 :(得分:1)

您可以将最后13位分成5,3,5位组。使用第一个和最后一个选择一个辅音字母(有21个,需要5个位,你可以从22重复),并为中间3选择一个元音字母(有5个,选择相同的方式)。这将给出大部分可发音的名字",其中一些也可能很有趣。

答案 1 :(得分:0)

我完成了上面的回复并提出了一个解决方案。它并不完美,但它有效......

if [ ! -f /home/pi/MAC_ADDRESS ]; then
    BASE28="ABC3DEFG4HJK6LMN7PQRT8UVW9XY";
    arg1=$(ifconfig | grep eth0 | awk '{if ($4 == "HWaddr") print $5 }');
    echo $arg1 > /home/pi/MAC_ADDRESS;
    arg1="${arg1//:}";
    arg1=${arg1:8:4};
    arg1=$(echo $arg1 | tr '[:lower:]' '[:upper:]');
    arg1=$(bc <<< "obase=28; ibase=16; $arg1");
    c="";
    for i in $arg1; do
        if [ $i -eq 08 ]; then
            i=8;
        fi
        if [ $i -eq 09 ]; then
            i=9;
        fi 
        b=${BASE28:$i:1};
        c=$c$b;
    done
    c=${c:(-3)};
    echo $c > /home/pi/CLIENT_ID;
fi

在for循环中,由于某种原因,我需要修复08和09 ......