你能帮我理解一下这个C#功能吗?

时间:2011-04-30 17:59:03

标签: c# arrays

我想在ColdFusion中编写以下C#函数,但我无法理解,因为我无法理解代码。我知道该函数使用mod操作检查11位CPF编号(巴西相当于美国SSN)的有效性。我完全没有C#的经验。

可以在this article中读取完整功能。

我不明白cpf[0]cpf[1]等来自哪里,以及方括号之间的数字是指什么。

//compute 1st verification digit.
var v1 = 10 * cpf[0] + 9 * cpf[1] + 8 * cpf[2] + 7 * cpf[3] + 6 * 
    cpf[4] + 5 * cpf[5] + 4 * cpf[6] + 3 * cpf[7] + 2 * cpf[8];
v1 = 11 - v1 % 11;
if (v1 >= 10)
    v1 = 0;
//compute 2nd verification digit.
var v2 = 11 * cpf[0] + 10 * cpf[1] + 9 * cpf[2] + 8 * cpf[3] + 7 * 
    cpf[4] + 6 * cpf[5] + 5 * cpf[6] + 4 * cpf[7] + 3 * cpf[8];
v2 += 2 * v1;
v2 = 11 - v2 % 11;
if (v2 >= 10)
    v2 = 0;
//True if verification digits are as expected.
return v1 == cpf[9] && v2 == cpf[10];

7 个答案:

答案 0 :(得分:3)

鉴于以下CPF 012.345.678-90

//compute 1st verification digit.
var v1 = 10 * cpf[0] + // 10 x 0 = 0
    9 * cpf[1] +       // 9  x 1 = 9
    8 * cpf[2] +       // 8  x 2 = 16
    7 * cpf[3] +       // 7  x 3 = 21
    6 * cpf[4] +       // 6  x 4 = 24
    5 * cpf[5] +       // 5  x 5 = 25
    4 * cpf[6] +       // 4  x 6 = 24
    3 * cpf[7] +       // 3  x 7 = 21
    2 * cpf[8]         // 2  x 8 = 16
; // result = 156

v1 = 11 - v1 % 11;     // 11 - 156 % 11 = 11 - 2 = 9
if (v1 >= 10)
    v1 = 0;            // 9 >= 10 ? v1 = 9

//compute 2nd verification digit.
var v2 = 11 * cpf[0] + // 11 x 0 = 0
    10 * cpf[1] +      // 10 x 1 = 10
    9 * cpf[2] +       // 9  x 2 = 18
    8 * cpf[3] +       // 8  x 3 = 24
    7 * cpf[4] +       // 7  x 4 = 28
    6 * cpf[5] +       // 6  x 5 = 30
    5 * cpf[6] +       // 5  x 6 = 30
    4 * cpf[7] +       // 4  x 7 = 28
    3 * cpf[8]         // 3  x 8 = 24
;

v2 += 2 * v1;          // 192 + 2 * 9 = 192 + 18 = 210
v2 = 11 - v2 % 11;     // 11 - 210 % 11 = 11 - 1 = 10
if (v2 >= 10)
    v2 = 0;            // 10 >= 10 ? v2 = 0

//True if verification digits are as expected.
// v1 == 9 && v2 == 0
return v1 == cpf[9] && v2 == cpf[10];

它只是打破纯数学

答案 1 :(得分:2)

cpf[0]cpf[10]可能是公积金号码的11位数字。据推测,这包括9位“真实”数据和2位校验和数据。据推测,这些2位数被计算为其他9位数的线性组合,以模11运算。

因此,此函数重新计算校验和(v1v2),然后检查它与收到的校验和数字(cpf[9]cpf[10])匹配。

这些校验和关系通常用于防止错误输入数字或意外交换相邻数字(例如,类似的方案用于ISBN)。

答案 2 :(得分:1)

这是用于确定数字有效性的算法。信用卡使用类似的算法(Luhn)。我们的想法是防止所有组合的一些排列作为防止欺诈的方式,并允许验证和提前选择退出:“这可能是一个有效的数字吗?”

使用该方法,您可以确定该数字是否为有效格式,如果是,您可以尝试使用它。如果没有,你不应该,因为它显然有效。

有关类似内容的信用卡号,请参阅此链接:http://www.merriampark.com/anatomycc.htm

另外“A [N]”表示“A的第N个元素,其中A是某些元素的数组。” cpf似乎是一个整数数组。

答案 3 :(得分:1)

这只是数字验证算法的应用。 cpf是您要检查的11位数字。

代码中没有任何复杂的C#特定的内容。

答案 4 :(得分:1)

您链接的文章似乎只显示部分c#源代码。根据前一节中的伪代码判断,cpf似乎只是一个包含11个整数的数组。

编辑:Google上有不同语言的代码示例。

ColdFusion:http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&loc=en_us&extid=1000248

VB:http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=3811&lngWId=10

这些看起来更完整,可能更容易理解。

答案 5 :(得分:1)

cpf似乎是一个整数数组,有11个项目。

每个都是通过索引访问的,所以第一个是 - cpf[0],第二个cpf[1]等...

v1v2在函数中声明,并被赋予计算值。

最后一行将这些计算值与cpf中最后两个数组项进行比较,大概是检查数字。

总而言之,这些代码看起来像对CPF编号执行计算并检查CPF是否有效。

答案 6 :(得分:1)

该等式基本上是一个非常简单的散列函数,它产生两个“校验位”。

此校验位“哈希”可用于验证校验数字附加到的9位数的有效性,与MD5和SHA1哈希可与文件相关联的方式相同,用于验证传输了适当的数据,或者在传输之前,期间或之后没有发生任何篡改。

这种情况下的数学有点简单和随意,但每次都会为同一输入产生相同的答案。只要每次都使用相同的方程式,您就可以通过许多不同的方式调整方程并最终得到有效的校验位。