MAC-адреса не являются уникальными
Могут быть и будут дубликаты с MAC. Для этого есть несколько причин, одна из которых заключается в том, что они не должны быть (глобально) уникальными.
MAC-адрес должен быть уникальным в локальной сети, поэтому ARP / NDP может выполнять свою работу, и коммутатор знает, куда отправлять входящие дейтаграммы. Обычно (не обязательно) это предварительное условие выполняется, и все работает просто отлично, просто потому, что вероятность наличия двух одинаковых MAC-адресов в одной локальной сети, даже если они не уникальны, довольно низкая.
Другая причина заключается в том, что просто существует больше устройств, чем существует адресов. В то время как 48-битные адреса звучат так, что адресов для всех достаточно до конца дней, это не так.
Адресное пространство разделено на две 24-битные половины (это немного сложнее, но давайте проигнорируем мелкие детали). Одна половина - это OUI, который вы можете зарегистрировать в IEEE и присвоить своей компании примерно за 2000 долларов. Оставшиеся 24 бита, вы делаете все, что хотите. Конечно, вы можете зарегистрировать несколько OUI, чем занимаются крупные игроки.
Возьмите Intel в качестве примера. Они зарегистрировали в общей сложности 7 OUI, что дало им в общей сложности 116 миллионов адресов.
На материнской плате моего компьютера (которая использует чипсет X99), а также на материнской плате моего ноутбука, а также на материнской плате каждого компьютера на базе x86, которым я владел в течение последних 10–15 лет, в состав чипсета входила сетевая карта Intel. Конечно, в мире насчитывается более 116 миллионов компьютеров на базе Intel. Таким образом, их MAC не могут быть уникальными (в некотором смысле глобально уникальными).
Кроме того, были зарегистрированы случаи, когда ... дешевле ... производители просто "крали" адреса из чужого OUI. Другими словами, они просто использовали какой-то случайный адрес. Я слышал о производителях, которые просто используют один и тот же адрес для полного ассортимента продукции. Ничто из этого не соответствует действительности и не имеет большого смысла, но что вы можете с этим поделать. Эти сетевые карты существуют. Опять же: вероятность того, что это станет практической проблемой, все еще очень низка, если адреса используются для того, для чего они предназначены, вам нужно иметь два из них в одной локальной сети, чтобы даже заметить.
Теперь, что делать с вашей проблемой?
Решение может быть проще, чем вы думаете. Ваши устройства IoT, скорее всего, будут нуждаться в некотором представлении о времени, обычно время автоматически определяется через NTP. Типичная точность NTP находится в микросекундном диапазоне (да, это микро, а не милли). Я просто побежал, ntpq -c rl
чтобы быть уверенным, и мне сказали 2 -20 .
Вероятность того, что два ваших устройства будут включены впервые в одну и ту же микросекунду, очень мала. Это обычно возможно (особенно, если вы продаете миллионы из них в очень короткие сроки, поздравляю вас с успехом!), Конечно. Но это не очень вероятно - на практике этого не произойдет. Таким образом, сэкономьте время после первой загрузки в постоянном магазине.
Время загрузки вашего устройства IoT будет одинаковым на всех устройствах. За исключением того, что это совсем не так .
Учитывая таймер высокого разрешения, время загрузки измеримо различается даже на одном и том же устройстве, каждый раз. Это может быть только несколько разных тактов (или несколько сотен тысяч, если вы читаете что-то вроде счетчика меток времени процессора), поэтому не совсем уникально, но это, безусловно, добавляет энтропию.
Точно так же время, необходимое connect
для возврата в первый раз, когда вы заходите на свой сайт API, будет немного, но измеримо, отличаться каждый раз. Аналогичным образом, getaddrinfo
при первом поиске имени хоста вашего веб-API для каждого устройства потребуется немного другое, измеримое количество времени.
Объедините эти три или четыре источника энтропии (MAC-адрес, время первого включения, время первой загрузки, время соединения) и рассчитайте из этого хеш. MD5 отлично подойдет для этой цели. Там ты уникален.
Хотя это на самом деле не гарантирует уникальность, это «в значительной степени» гарантирует это с незначительной вероятностью провала. Вам потребуется два устройства с одинаковыми MAC-адресами, которые впервые включаются в одну и ту же микросекунду и требуют одинакового времени для загрузки и подключения к вашему сайту. Этого не произойдет. Если это произойдет, вы должны немедленно начать играть в лотерею, потому что, по всей видимости, вы гарантированно выиграете.
Однако если «не произойдет» недостаточно для гарантии, просто передайте каждому устройству последовательно увеличивающееся число (генерируемое на сервере) при первом обращении к вашему веб-API. Пусть устройство запомнит этот номер, готово.