эти два алгоритма используются для проверки действительных номеров участников
первый - тот, который мне дал компания,
второе - это то, что я разработал, из своих тестов я не вижу никакой разницы между ними функционально,
Есть ли случаи, когда кто-нибудь может увидеть, где они будут возвращать разные результаты?
test input:
6014355021355010
or
6014355065446212
or
6014351000254605
Контрольная цифра рассчитывается с использованием первых 15 цифр следующим образом:
- Суммируйте цифры в четных позициях слева направо
- Умножить каждую цифру в нечетных позициях (слева направо
справа) по номеру 2. Если есть какие-либо результаты
2 цифры, суммируйте цифры в одну.
Суммируйте цифры от каждого
умножение в конечный результат.
- Добавьте окончательные результаты шагов 1 и 2.
- Возьмите последнюю цифру результата из шага 3 и вычтите из 10 до
введите контрольную цифру.
- Возьмите последнюю цифру из 16-значного номера и сравните с контрольной цифрой
- если они равны, это действительно
против
Контрольная цифра вычисляется с использованием целых 16 цифр следующим образом:
- Суммируйте цифры в четных позициях слева направо
- Умножить каждую цифру в нечетных позициях (слева направо
справа) по номеру 2. Если есть какие-либо результаты
2 цифры, суммируйте цифры в одну.
Суммируйте цифры от каждого
умножение в конечный результат.
- Добавьте окончательные результаты шагов 1 и 2.
- Возьмите конечный результат и модуль 10
- Если результат равен 0, он действителен
<час />
Обновление:
Итак. Я попытался создать оба этих алгоритма в PHP,
второй, я успешно создал,
первое, однако, я не могу приступить к работе.
возможно, я прочитал это неправильно, но вот оригинал, который мне дали для первого алгоритма:
16-значный номер модуля 10 расчет контрольной цифры
Контрольная цифра рассчитывается с использованием первых 15 цифр следующим образом:
1. Суммируйте цифры в четных позициях слева направо
2. Умножьте каждую цифру в нечетных позициях (слева направо) на число 2
Если какой-либо результат состоит из 2 цифр, суммируйте цифры в одну.
Суммируйте цифры от каждого умножения в окончательный результат.
3. Добавьте окончательные результаты шагов 1 и 2.
4. Возьмите последнюю цифру результата из шага 3 и вычтите из 10, чтобы получить контрольную цифру.
Если результат шага 3 кратен 10, контрольная цифра будет равна нулю.
Пример 6014 3590 0000 0928
1,0 0 + 4 + 5 + 0 + 0 + 0 + 9 = 18
2,0 6 * 2 = 12 , поэтому 1 + 2 = 3
2,1 1 * 2 = 2
2,2 3 * 2 = 6
2,3 9 * 2 = 18 , поэтому 1 + 8 = 9
2,4 0 * 2 = 0
2,5 0 * 2 = 0
2,6 0 * 2 = 0
2,7 2 * 2 = 4
2,8 3 + 2 + 6 + 9 + 0 + 0 + 0 + 4 = 24
3,0 18 + 24 = 42
4,0 Контрольная цифра 10 - 2 = 8
5,0 8 = 16-я цифра (601435900000092 [8])
<ч />
Обновление2:
хорошо, я исправил алгоритм,
также, я должен отметить, что есть еще две проверки
if (длина номера! = 16)
возврат 1;
а также
if (первые 5 символов! = 601435)
возврат 1;
так есть какие-нибудь счетчики к этому?
ура,
Matt
Проверка алгоритма [php]
<?php
$file = file_get_contents('fb.csv');
$numbers = explode("\n", $file);
function validate_flybuys($number) {
$r = array ('o' => '0', 'i' => '1', 'l' => '1', 'e' => '3', ' ' => '');
$flybuys = trim(strtolower($number));
$flybuys = str_replace(array_keys($r), $r, $flybuys);
if('601435' != substr($flybuys, 0, 6) || strlen($flybuys) != 16)
return 1;
$evens = 0;
$odds = '';
for($i = 0; $i <= 15; $i+=2) {
$odds .= $flybuys[$i];
$evens += $flybuys[$i+1];
}
$odds = str_split($odds);
foreach($odds as &$odd) {
$odd = $odd*2;
if($odd >= 10) {
$odd = str_split($odd);
$odd = $odd[0] + $odd[1];
}
}
return (array_sum($odds)+$evens) % 10;
}
function validate_flybuys2($number) {
$r = array ('o' => '0', 'i' => '1', 'l' => '1', 'e' => '3', ' ' => '');
$flybuys = trim(strtolower($number));
$flybuys = str_replace(array_keys($r), $r, $flybuys);
if('601435' != substr($flybuys, 0, 6) || strlen($flybuys) != 16)
return 1;
$evens = 0;
$odds = '';
for($i = 0; $i <= 14; $i+=2) {
$odds .= $flybuys[$i];
if($i != 14)
$evens += $flybuys[$i+1];
}
$odds = str_split($odds);
foreach($odds as &$odd) {
$odd = $odd*2;
if($odd >= 10) {
$odd = str_split($odd);
$odd = $odd[0] + $odd[1];
}
}
$total = (array_sum($odds))+$evens;
$total = str_split($total);
$check = 10 - $total[1];
$check = $check % 10;
if($check == substr($flybuys, 15, 1))
return 0;
else
return $check;
}
foreach($numbers as $number) {
$valid = validate_flybuys($number);
$valid2 = validate_flybuys2($number);
if($valid != $valid2 || $valid != 0) {
echo '<hr />';
echo 'NUMBER: '.$number.'<br />';
echo 'V1: '.$valid.'<br />';
echo 'V2: '.$valid2.'<br />';
}
}
если кто-то заинтересован и комментирует, я могу опубликовать несколько образцов для проверки:)
ох и не стесняйтесь оптимизировать код 8D