Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная контрольная цифра / 12 сообщений из 12, страница 1 из 1
14.10.2016, 13:41
    #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
14.10.2016, 14:29
    #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
14.10.2016, 15:58
    #39327209
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничная контрольная цифра
По идее если поменять местами 0 и 9 то девятка должна удваиваться о остатком 8(mod 10)
и сумма должна изменится.
...
Рейтинг: 0 / 0
14.10.2016, 16:15
    #39327234
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничная контрольная цифра
Плохо считал.
Нечетная: 9
Четная: (9*2 + 1) % 10 = 9
...
Рейтинг: 0 / 0
14.10.2016, 16:18
    #39327237
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничная контрольная цифра
А точно. +1 забыл.
...
Рейтинг: 0 / 0
14.10.2016, 17:51
    #39327305
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничная контрольная цифра
Может быть лучше отказаться от использования операции остатка от деления на 10? Достаточно будет вычесть 10 из двузначного числа, поскольку оно не превосходит 20. Можно ли как-то отказаться от сопровождения pos, не хотелось бы сопровождать её. И я бы переименовал res в temp или t, как правило, под res мы понимаем результат выполнения функции, а не временную переменную))
...
Рейтинг: 0 / 0
14.10.2016, 18:01
    #39327310
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тяпничная контрольная цифра
mayton На днях попал в руки алгоритм расчёта контрольной цифры в банковских картах (обычно
кредитки с 16-значным номером типа Visa, MasterCard).

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

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

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

Кстати у этого ИНН есть еще одит артефакт. Точная дата рождения зашита в номер.
...
Рейтинг: 0 / 0
14.10.2016, 23:37
    #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]