从 4 个十六进制数字生成 'unique' 3 个字符的标签

Generating a 'unique' 3 character tag from 4 Hex digits

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

可以单独使用 MAC 地址的一部分来完成,但我想生成一个更符合人类的代码以减少错误。转换只需在一个方向上进行。

我想我已经将其分解为合乎逻辑的步骤,但我不确定如何才能有效地实施它们。

  1. 取 MAC 地址的最后 4 个字符
  2. 转换为二进制 - 16 位
  3. 删除 MSB 保留 15 位
  4. 反转位的顺序 - 在我看来,这会使字符更加随机化,使最终字符串更容易记住
  5. 将 15 位分成 5 位的 3 个块
  6. 将每个 5 位块映射到 letter/number 跳过 I、1、O 和 0 以避免混淆
  7. 输出3个字符串

您可以将最后 13 位分成 5、3、5 位组。首尾选一个辅音字母(共21个,需要5位,从22个开始重复),中间3个选一个元音字母(共5个,选法相同)。这将给出大部分发音 "names",其中一些可能也很搞笑。

我仔细阅读了上面的回复并提出了解决方案。它并不完美,但它确实有效...

if [ ! -f /home/pi/MAC_ADDRESS ]; then
    BASE28="ABC3DEFG4HJK6LMN7PQRT8UVW9XY";
    arg1=$(ifconfig | grep eth0 | awk '{if ( == "HWaddr") print  }');
    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...