Вот одна возможность.
Для кодов из девяти символов вставьте случайную четную букву (B, D, F, ...) после первой цифры и две случайные цифры в конце.
Для кодов из одиннадцати символов вставьте случайную нечетную букву (A, C, E, ...) после первой цифры и оставьте все остальное как есть.
В обоих случаях вы также можете использовать ROT-13 безшумные альфа-символы и ROT-5 цифры для дальнейшего изменения кодов, хотя я не уверен, что это необходимо для ваших целей.
Таким образом, вы получите двенадцатизначный код для обоих случаев, который вы можете изменить в случае необходимости.Это читабельно и уникально.Это не, как вы говорите, криптография уровня АНБ, но она должна сдерживать случайного наблюдателя.
Если вам нужен хеш, который генерирует более детерминированный результат (то есть, нет случайных чисел), вы можетесделать добавленный материал зависимым от входных данных.Вот один из способов, возможно, есть еще сотни.Рассмотрим два типа ввода:
AB12345C6
AB12345C678
В обоих случаях вставьте символ после 1
, но сделайте его зависимым от ввода.Сложите цифры в позициях 1
, 3
и 6
и возьмите их по модулю-10, чтобы получить от 0 до 9.
Используйте это как поиск в строке "ABXVRWECPU" длядевятизначный код или «OIYJTQLSDK» для одиннадцатизначного кода для получения символа.Затем вы можете использовать этот символ в результирующем коде, чтобы решить, был ли он изначально кодом из девяти или одиннадцати символов (настоящий параноик будет гарантировать, что эти строки не сохраняются в текстовом виде в коде).
Для двухцифры, добавляемые к первому случаю, сложите коды ASCII для A, C и функцию B (например, xor 'B' с 147), затем добавьте это к числам, образованным из 64, 51 и 23.
Возьмите модуль 87 из этого, затем добавьте 7, чтобы получить значение от 7 до 93.