Короткі унікальні надійні номери

Короткі унікальні надійні номери

У вас було таке що доводиться заповняти якийсь багатозначний код який за раз не перепишеш і губишся в підрахунку дюжини цифр? Я завжди думав чи не можна зробити і короткий номер і зручний для читання. Наприклад ABC123-DFG678 переписати легко, хоча він досить довгий. А ще можна зробити, щоб система зрозуміла що є помилка якщо така була. В мене кілька ідей на цю тему, от я сів і порахував.

Патерни читати простіше, ніж випадковий набір букв та цифр. Дві-три букви, дві-три цифри, потім знову якщо потрібно, здається прямо очевидним рішенням. Буде трохи коротшим ніж просто цифри і трохи довшим ніж цифробуквене кодування з довільними позиціями цифр і букв.

Суть ідеї простого читання вже я підказав

/AKD932-MZR615 vs 82737882637448

Що ж дати користувачу

А що до стійкості до помилок?

Можна додати контрольну суму, тобто символ. І навіть якщо при вводі помилитися одним знаком, це стане помітно відразу. А якщо додати два символи, то помилку в один символ можна алгоритмічно виправити, а помилку у два символи помітити. Щоб випадково не переплутати з іншим рахунком. Надійно.

Що якщо хочеться пронумеровати, але не послідовно, а випадково, і так щоб не було колізій?

Отут зазвичай рішення - обирати ключ довжиною гігаліон біт, а користувачі хай мучаються. Але я проти. Поки не закінчилися всі N-символьні ключі, будь ласка, не переходьте на N+1 символьні. А як же захиститися від колізій? Дуже просто. Не перевіряти звісно на унікальність. Просто рахувати з одиниці і закодовувати будь-яким блочним шифром. Це їх характеристика. На вхід подаєте послідовні числа 0000, 0001, 0002, на виході отримуєте "випадкові", унікальні, неповторювані числа 8372, 9274, 1290. Абсолютно надійно без колізій, дуже швидко з мінімальним використанням памʼяті - не потрібно зберігати всі номери. Зворотна процедура аналогічна - берете "випадковий" ключ, "дешифруєте" і отримуєте його "номер". Поки номер не дійшов до максимума - ви абсолютно точно не перебрали всі варіанти "випадкових" ключів і у вас немає жодних колізій.

Потрібно тільки обрати блочний шифр з такою ж довжиною блоку яку довжину ключа ви бажаєте. А якщо немає такого - створіть алгоритм з таким розміром блоку, візьміть наприклад AES і змодифікуйте. Це просто. Криптографічної стійкості не буде, але ми не цього добивалися. Видавати "випадкові" номери без колізій буде аналогічно.

На цьому можна було б закінчити, але я мав цікаву ідею...

А що якщо згенерувати номери так щоб при помилці в один символ не можна було попасти на інший валідний номер? Шикарна ж ідея.

Спробував знайти алгоритми, якось вийшло не дуже. Що ж, брутфорс наша сила - генеруємо значення, якщо при помилці в один символ ми знаходимо хоча б одне таке саме унікальне значення, значить цей номер не додаємо в список. Брутив, я брутив різні патерни - букво-числові номери, числові номери. І тут до мене дійшло. Що це ж те саме що контрольна сума з одним символом. Одним словом KISS, використовуйте контрольну суму одним символом. Іронія ще в тому, що цей допис в блог я почав писати поки брутфорс працював, хотів поділитися результатами роботи своєї геніальної ідеї. А виявилося що все створено до нас. Нічого, велосипеди створювати корисно.

Comments