这两种算法用于检查有效的会员号码
第一个是公司给我的,
第二个是我设计的,从我的测试中我看不出它们在功能上有任何区别,
有没有任何情况下任何人都可以看到他们会返回不同的输出?
test input:
6014355021355010
or
6014355065446212
or
6014351000254605
校验位使用前 15 位数字计算如下:
- 从左到右将偶数位置上的数字相加
- 将奇数位置的每个数字相乘(从左到右)
右)按数字 2。如果有结果
是2位数字,将数字相加为1。
将每个数字相加
乘法得到最终结果。
- 将步骤 1 和步骤 2 的最终结果相加。
- 取步骤 3 结果的最后一位,然后从 10 中减去
给出校验位。
- 取出16位数字的最后一位并与校验位进行比较
- 如果它们相等,则有效
vs
校验位由全部 16 位数字计算得出,如下:
- 从左到右将偶数位置上的数字相加
- 将奇数位置的每个数字相乘(从左到右)
右)按数字 2。如果有结果
是2位数字,将数字相加为1。
将每个数字相加
乘法得到最终结果。
- 将步骤 1 和步骤 2 的最终结果相加。
- 取最终结果和模10
- 如果结果为0,则有效
Update:
ok so. I have tried to create both these algorithms in php,
the second one, i have created successfully,
the first however, i can not seem to get to work.
可能我读错了,但是,这是我为第一个算法提供的原始简介:
16位数字模数10位校验位计算
校验位使用前 15 位数字计算如下:
1.从左到右将偶数位置上的数字相加
2.将奇数位置(从左到右)的每个数字乘以数字 2
如果有任何结果是 2 位数字,则将这些数字相加为 1。
将每次乘法的数字相加得到最终结果。
3.将步骤 1 和步骤 2 的最终结果相加。
4.取出步骤 3 结果的最后一位,然后减去 10,得到校验位。
如果步骤 3 的结果是 10 的倍数,则校验位将为 0。
Example 6014 3590 0000 0928
1.0 0 + 4 + 5 + 0 + 0 + 0 + 9 = 18
2.0 6 * 2 = 12 so 1 + 2 = 3
2.1 1 * 2 = 2
2.2 3 * 2 = 6
2.3 9 * 2 = 18 so 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 The check digit is 10 - 2 = 8
5.0 8 = the 16th digit (601435900000092[8])
Update2:
ok, so i have corrected the algorithm,
另外,我应该提到,还有另外两项检查
if(数字长度!= 16)
返回1;
和
if(前 5 个字符!= 601435)
返回1;
那么对此有什么对策吗?
干杯,
马特
Algorithm test [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