powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная контрольная цифра
12 сообщений из 12, страница 1 из 1
Тяпничная контрольная цифра
    #39327043
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привед други!

Илья. Сова. Сашик. Дима. Зяма. И другие (ш)кодеры, орхи-текторы, аналитеги и сочувствующие.

Не был тут тыщу лет. Сорян. Привален был завалами проекта. Но сейчас выдалась минутка.

На днях попал в руки алгоритм расчёта контрольной цифры в банковских картах (обычно
кредитки с 16-значным номером типа Visa, MasterCard).

Первоисточника найти не могу. Есть осколочные сведения об алгоритме для кредиток.
http://vsemproblemam.net/credit-cards/sekrety-creditnyh-card-o-kotoryh-vam-ne-govoryat.html

Возможно он называется Luhn-algorithm однако неизвестно работает-ли для номеров с более
чем 16 разрядов и во всех-ли банках поддерживается его каноничная версия.

Мой говно-кодец (без проверок на валидность формата).
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public static boolean checkCard(String cardNumber) {
        int pos = 0;
        int sum = 0;
        for (int i = 0; i < cardNumber.length(); i++) {
            int c = cardNumber.charAt(i);
            if (c >= '0' && c <= '9') {
                if ((pos & 1) == 0) {
                    int res = ((c - '0') << 1);
                    if (res >= 10) {
                        sum += res %10;
                        sum++;
                    } else {
                        sum += res;
                    }
                } else {
                    sum += (c - '0');
                }
                pos++;
            } 
        }
        return sum % 10 == 0;
    }



Вобщем предлагаю обсудить слабые места. Непонятно фиксит-ли контрольная цифра
случай случайной замены похожих цифр (например 3 на 8). И если этот алгоритм не надежен
то какой надежен. Или случайные перестановки местами цифирок (типа 89 => 98).

Также вопрос интересно рассмотреть не только для банковских карт но и для ИНН физлиц
https://ru.wikipedia.org/wiki/Идентификационный_номер_налогоплательщика
для которых я еще пока ничено не накодил но тоже интересно.

Также интересны ваши истории из практики и разные случаи. Как номера хранят в БД, чекают-ли
эту контрольную цифру и т.п.

P.S. Хардкод приветствуется!

P.P.S. Моар хардкода!!
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327106
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затестил две карты (виза и мастер разных банков) - обе true

Затестил двухзначные перестановки: 09 и 90 дают одно и тоже sum % 10 = 9.

Немного причесал твой код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
		public static int checkCard(String cardNumber) {
			int pos = 0, sum = 0;
			foreach(char c in cardNumber) {
				if (c >= '0' && c <= '9') {
					int res = (c - '0');
					if ((pos & 1) == 0) {
						res <<= 1;
						if (res >= 10) {
							res = res % 10 + 1;
						}
					}
					sum += res;
					pos++;
				} 
			}
			return sum % 10;
		}
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327209
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее если поменять местами 0 и 9 то девятка должна удваиваться о остатком 8(mod 10)
и сумма должна изменится.
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327234
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плохо считал.
Нечетная: 9
Четная: (9*2 + 1) % 10 = 9
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327237
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно. +1 забыл.
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327305
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть лучше отказаться от использования операции остатка от деления на 10? Достаточно будет вычесть 10 из двузначного числа, поскольку оно не превосходит 20. Можно ли как-то отказаться от сопровождения pos, не хотелось бы сопровождать её. И я бы переименовал res в temp или t, как правило, под res мы понимаем результат выполнения функции, а не временную переменную))
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327310
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton На днях попал в руки алгоритм расчёта контрольной цифры в банковских картах (обычно
кредитки с 16-значным номером типа Visa, MasterCard).

Если бы вам на днях случайно попался алгоритм расчета CVC2 или других аналогичных кодов безопасности по номеру карты, то уверен обсуждение данного вопросы было бы намного живее))
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327369
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил 16-тизначные номера карт 8-ти банков, все говорят true.
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327371
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТакже интересны ваши истории из практики и разные случаи. Как номера хранят в БД, чекают-ли
эту контрольную цифру и т.п.
Проверял EAN13 на входе из посторонних источников, польза есть, откровенную лажу набитую руками отфильтровывало. Но не панацея, копипаст нормального товара с последующим изменением наименования проскакивал.

ИНН нет смысла проверять, банки проверят когда деньги отправить захочешь, не совпадет - платеж не зачислят получателю.
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327374
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryалгоритм расчета CVC2
это случайное число
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonТакже интересны ваши истории из практики и разные случаи. Как номера хранят в БД, чекают-ли
эту контрольную цифру и т.п.
Проверял EAN13 на входе из посторонних источников, польза есть, откровенную лажу набитую руками отфильтровывало. Но не панацея, копипаст нормального товара с последующим изменением наименования проскакивал.

ИНН нет смысла проверять, банки проверят когда деньги отправить захочешь, не совпадет - платеж не зачислят получателю.
Украинские ИНН (10-значное целое) проверяется по аналогичной схеме.
Только ведомства которые их распределяли не следовали этой формуле
и насоздавали кучу битых ИНН. Тоесть алгоритмически, проверка не проходит
но практически бумага (справка о выдаче ИНН) является более весомой.
И такие ИНН считаются достоверными.

Кстати у этого ИНН есть еще одит артефакт. Точная дата рождения зашита в номер.
...
Рейтинг: 0 / 0
Тяпничная контрольная цифра
    #39327453
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМожет быть лучше отказаться от использования операции остатка от деления на 10? Достаточно будет вычесть 10 из двузначного числа, поскольку оно не превосходит 20. Можно ли как-то отказаться от сопровождения pos, не хотелось бы сопровождать её. И я бы переименовал res в temp или t, как правило, под res мы понимаем результат выполнения функции, а не временную переменную))
Если ты хочешь рефакторить этот алгоритм то я не против. Но я не вижу
особого смысла переименовывать переменные.

Заменить MOD на вычитание? Ну что-ж пускай будет. Вроде полезная
оптимизация.

Но я уже нашел более интересный метод некого господина Верхоффа
http://www.cs.utsa.edu/~wagner/laws/verhoeff.html
который спецом исследовал такие ошибки как перестановки
(он их называет adjacent transpositions) и заложил в свой алгоритм
контроля защиту от них.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная контрольная цифра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]