У нас на работе используются идентификаторы из 6 цифр и одной буквы. Цифры выдаются системой по порядку, а буква избыточная, для контроля ошибок. Она генерится специальным алгоритмом так, чтобы у «соседних» номеров буквы были разными — соседними мы называем номера, отличающиеся от исходного одной (любой) цифрой, либо (не 100% достоверная информация) перестановкой двух любых (возможно, соседних) цифр. То есть такая вот минимальная защита от классических описок/опечаток.
Ну а дальше классика — дошли до 999999, подняли алгоритм генерации букв, в нём комментариев ноль, документации ноль, написавший его человек ушёл на пенсию настолько давно что никто не помнит даже его имени. Ходят какие-то слухи, что он не сам придумал алгоритм, а содрал его у более продвинутых товарищей (цитируются американские военные), и это внушает надежду, что кто-то опознает алгоритм.
Вот его причёсанная java-версия (изначально, конечно же, написан на Cobol’е), вам что-нибудь говорят эти цифры?
private int AACUM; private String AAMEF; private String [] AAVALNUM = {"0003", "0004", "0100", "0104", "0001", "0005", "0101", "0105", "0002", "0006", "0101", "0002", "0004", "0006", "0100", "0102", "0104", "0106", "0001", "0003", "0104", "0001", "0002", "0003", "0004", "0005", "0006", "0007", "0100", "0101"}; private String [] AALET = {"A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z"}; private String bis(String AAZCIN) { AACUM = 0; AAMEF = "90" + AAZCIN.substring(0,2) + "0" + AAZCIN.substring(2,6) ;//+ "0"; for (int j=0; j <3; j++) { for (int i = 0; i < 3; i++) { AACUM += Integer.parseInt(AAVALNUM[10*i + Integer.parseInt(AAMEF.substring(j*3 +i, j*3 +i+1))]); } } return AALET[((AACUM % 100) % 8) + (8*((AACUM/100) % 3))]; }
Или хотя бы общие соображения о том, как он работает, и как его расширить до 7 цифр :-)