Luhn算法

LUHN是一个算法,它的就要作<wbr>用是为了计算信用卡等证件号码的<wbr>合法性。我们用一个例子来看一下<wbr>这个算法的工作过程: <p>假设我们有一个数4992 73 9871,这个数是没有带校验码<wbr>的,算法的计算分为三步:</wbr></p> <ol> <li>由最低位起每隔一位取一个数字,<wbr>将这个数字乘2;<br>1*2=<font color="#008000">2</font> 8*2=<font color="#ff0080">16</font> 3*2=<font color="#008000">6</font> 2*2=<font color="#ff0080">4</font> 9*2=<font color="#008000">18</font></wbr> </li> <li>将数字中余下的数字和上面结果中<wbr>的数字直接相加,得到结果B;<br>4 + <font color="#008000">1</font>+<font color="#008000">8</font> + 9 + <font color="#ff0080">4 </font>+ 7 + <font color="#008000">6</font> + 9 + <font color="#ff0080">1</font>+<font color="#ff0080">6</font> + 7 + <font color="#008000">2</font> = 64</wbr> </li> <li>生成校验码C=A-B,其中A是<wbr>比B大的10倍数中最小的数字,<wbr>如B=86,则A=90;如B=<wbr>34,A=40;<br>6 = 70-64</wbr></wbr></wbr> </li> <li>将校验码加在原来数字的后面生成<wbr>合法的帐户密码;<br>4992 73 9871 </wbr> </li> </ol> <p>现已Master Card为例:</p> <div class="highlighter"> <ol class="highlighter-c"> <li><span>&lt;script&gt;</span></li> <li class="alt"> <span></span><span class="keyword">function</span><span>isValidMasterCard(sText){</span> </li> <li> <span></span><span class="keyword">var</span><span>reMasterCard=/^(5[1-5]/d{2})[/s/-]?(/d{4})[/s/-]?(/d{4})[/s/-](/d{4})$/;</span> </li> <li class="alt"><span></span></li> <li> <span></span><span class="keyword">if</span><span>(reMasterCard.test(sText)){</span> </li> <li class="alt"> <span></span><span class="keyword">var</span><span>sCardNum=RegExp.$1+RegExp.$2+RegExp.$3+RegExp.$4;</span> </li> <li><span>alert(sCardNum);</span></li> <li class="alt"> <span></span><span class="comment">//Luhnalgorithmhere </span><span></span> </li> <li> <span></span><span class="keyword">return</span><span>luhnCheckSum(sCardNum);</span> </li> <li class="alt"> <span>}</span><span class="keyword">else</span><span>{</span> </li> <li> <span></span><span class="keyword">return</span><span></span> </li> <li class="alt"><span>}</span></li> <li><span>}</span></li> <li class="alt"><span></span></li> <li> <span></span><span class="keyword">function</span><span>luhnCheckSum(sCardNum){</span> </li> <li class="alt"> <span></span><span class="keyword">var</span><span>iOddSum=0;</span> </li> <li> <span></span><span class="keyword">var</span><span>iEvenSum=0;</span> </li> <li class="alt"> <span></span><span class="keyword">var</span><span>bIsOdd=</span><span class="keyword">true</span><span>;</span> </li> <li><span></span></li> <li class="alt"> <span></span><span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>i=sCardNum.length-1;i&gt;=0;i--){</span> </li> <li> <span></span><span class="comment">//alert("length="+sCardNum.length); </span><span></span> </li> <li class="alt"> <span></span><span class="comment">//alert("sCardNum.char("+i+")="+sCardNum.charAt(i)); </span><span></span> </li> <li> <span></span><span class="keyword">var</span><span>iNum=parseInt(sCardNum.charAt(i));</span> </li> <li class="alt"><span></span></li> <li> <span></span><span class="keyword">if</span><span>(bIsOdd){</span> </li> <li class="alt"> <span></span><span class="comment">//反向奇數求和 </span><span></span> </li> <li><span>iOddSum+=iNum;</span></li> <li class="alt"><span></span></li> <li> <span>}</span><span class="keyword">else</span><span>{</span> </li> <li class="alt"> <span></span><span class="comment">//偶數 </span><span></span> </li> <li> <span></span><span class="keyword">if</span><span>(iNum&gt;9){</span> </li> <li class="alt"> <span>iNum=eval(iNum.toString().split(</span><span class="string">""</span><span>).join(</span><span class="string">"+"</span><span>));</span> </li> <li><span>}</span></li> <li class="alt"><span>iEvenSum+=iNum;</span></li> <li><span></span></li> <li class="alt"><span>}</span></li> <li><span>bIsOdd=!bIsOdd;</span></li> <li class="alt"><span>}</span></li> <li> <span></span><span class="keyword">return</span><span>((iEvenSum+iOddSum)%10==0);</span> </li> <li class="alt"><span>}</span></li> <li><span></span></li> <li class="alt"> <span>alert(isValidMasterCard(</span><span class="string">"5432123456789012"</span><span>));</span> </li> <li> <span>alert(isValidMasterCard(</span><span class="string">"5432-1234-5678-9012"</span><span>));</span> </li> <li class="alt"><span></span></li> <li><span>&lt;/script&gt;</span></li> </ol> </div> <p><span><font style="BACKGROUND-COLOR: #f8f8f8" color="#000000">C++例子:</font></span></p> <p><span><font style="BACKGROUND-COLOR: #f8f8f8" color="#000000">LLUHN.cpp</font></span></p> <span> <div class="highlighter"> <ol class="highlighter-cpp"> <li> <span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li> <span></span><span class="comment">//DesignedbyLiutao,Xi'anJitotongUniversity </span><span></span> </li> <li class="alt"> <span></span><span class="comment">//2001-04-23 </span><span></span> </li> <li> <span></span><span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li> <span></span><span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">//LLUHN.cpp:implementationoftheLLUHNclass. </span><span></span> </li> <li> <span></span><span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li><span></span></li> <li class="alt"> <span></span><span class="preprocessor">#include"LLUHN.h" </span><span></span> </li> <li><span></span></li> <li class="alt"> <span></span><span class="preprocessor">#ifdef_DEBUG </span><span></span> </li> <li> <span></span><span class="preprocessor">#undefTHIS_FILE </span><span></span> </li> <li class="alt"> <span></span><span class="keyword">static</span><span></span><span class="datatypes">char</span><span>THIS_FILE[]=__FILE__;</span> </li> <li> <span></span><span class="preprocessor">#definenewDEBUG_NEW </span><span></span> </li> <li class="alt"> <span></span><span class="preprocessor">#endif </span><span></span> </li> <li><span></span></li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li> <span></span><span class="comment">//Construction/Destruction </span><span></span> </li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li><span></span></li> <li class="alt"><span>LLUHN::LLUHN()</span></li> <li><span>{</span></li> <li class="alt"> <span>m_strCardNum=_T(</span><span class="string">""</span><span>);</span> </li> <li><span>}</span></li> <li class="alt"><span></span></li> <li><span>LLUHN::LLUHN(CStringstrCardNum)</span></li> <li class="alt"><span>{</span></li> <li> <span></span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>i=0;i&lt;strCardNum.GetLength();i++)</span> </li> <li class="alt"> <span></span><span class="keyword">if</span><span>(!isdigit(strCardNum[i]))</span> </li> <li><span>{</span></li> <li class="alt"><span>LLUHN();</span></li> <li> <span></span><span class="keyword">return</span><span>;</span> </li> <li class="alt"><span>}</span></li> <li><span>m_strCardNum=strCardNum;</span></li> <li class="alt"><span>}</span></li> <li><span></span></li> <li class="alt"><span>LLUHN::~LLUHN()</span></li> <li><span>{</span></li> <li class="alt"> <span>m_strCardNum=_T(</span><span class="string">""</span><span>);</span> </li> <li><span>}</span></li> <li class="alt"><span></span></li> <li> <span></span><span class="preprocessor">#defineCurrentDigit(i)(m_strCardNum[i]-'0') </span><span></span> </li> <li class="alt"><span></span></li> <li> <span></span><span class="datatypes">BOOL</span><span>LLUHN::IsValid()</span> </li> <li class="alt"><span>{</span></li> <li> <span></span><span class="datatypes">int</span><span>sum=0;</span> </li> <li class="alt"> <span></span><span class="keyword">if</span><span>(m_strCardNum.IsEmpty())</span><span class="keyword">return</span><span></span><span class="keyword">false</span><span>;</span> </li> <li> <span></span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>i=m_strCardNum.GetLength()-2;i&gt;=0;)</span> </li> <li class="alt"><span>{</span></li> <li><span>sum+=CurrentDigit(i)*2&gt;10?1+(CurrentDigit(i)*2)%10:CurrentDigit(i)*2,i--;</span></li> <li class="alt"> <span></span><span class="keyword">if</span><span>(i&gt;=0)sum+=CurrentDigit(i),i--;</span> </li> <li><span>}</span></li> <li class="alt"> <span></span><span class="keyword">return</span><span>(10-sum%10)==(m_strCardNum[m_strCardNum.GetLength()-1]-</span><span class="string">'0'</span><span>);</span> </li> <li><span>}</span></li> <li class="alt"><span></span></li> <li> <span></span><span class="datatypes">char</span><span>LLUHN::GetCheckSum()</span> </li> <li class="alt"><span>{</span></li> <li> <span></span><span class="datatypes">int</span><span>sum=0;</span> </li> <li class="alt"> <span></span><span class="keyword">if</span><span>(m_strCardNum.IsEmpty())</span><span class="keyword">return</span><span></span><span class="keyword">false</span><span>;</span> </li> <li> <span></span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>i=m_strCardNum.GetLength()-1;i&gt;=0;)</span> </li> <li class="alt"><span>{</span></li> <li><span>sum+=CurrentDigit(i)*2&gt;10?1+(CurrentDigit(i)*2)%10:CurrentDigit(i)*2,i--;</span></li> <li class="alt"> <span></span><span class="keyword">if</span><span>(i&gt;=0)sum+=CurrentDigit(i),i--;</span> </li> <li><span>}</span></li> <li class="alt"> <span></span><span class="keyword">return</span><span>(10-sum%10+</span><span class="string">'0'</span><span>);</span> </li> <li><span>}</span></li> <li class="alt"> <span></span><span class="preprocessor">#undefCurrentDigit </span><span></span> </li> <li><span></span></li> <li class="alt"> <span></span><span class="datatypes">BOOL</span><span>LLUHN::SetCardNum(CStringstrCardNum)</span> </li> <li><span>{</span></li> <li class="alt"> <span></span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>i=0;i&lt;strCardNum.GetLength();i++)</span> </li> <li> <span></span><span class="keyword">if</span><span>(!isdigit(strCardNum[i]))</span><span class="keyword">return</span><span></span><span class="keyword">false</span><span>;</span> </li> <li class="alt"><span>m_strCardNum=strCardNum;</span></li> <li> <span></span><span class="keyword">return</span><span></span><span class="keyword">true</span><span>;</span> </li> <li class="alt"><span>}</span></li> <li><span></span></li> <li class="alt"> <span></span><span class="keyword">const</span><span>CStringLLUHN::GetCardNum()</span> </li> <li><span>{</span></li> <li class="alt"> <span></span><span class="keyword">return</span><span>m_strCardNum;</span> </li> <li><span>}</span></li> </ol> </div> <p class="alt"><span>LLUHN.h</span></p> <span> <div class="highlighter"> <ol class="highlighter-cpp"> <li> <span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li> <span></span><span class="comment">//DesignedbyLiutao,Xi'anJitotongUniversity </span><span></span> </li> <li class="alt"> <span></span><span class="comment">//2001-04-23 </span><span></span> </li> <li> <span></span><span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li> <span></span><span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">//LLUHN.h:interfacefortheLLUHNclass. </span><span></span> </li> <li> <span></span><span class="comment">// </span><span></span> </li> <li class="alt"> <span></span><span class="comment">// </span><span></span> </li> <li><span></span></li> <li class="alt"> <span></span><span class="preprocessor">#if!defined(AFX_LLUHN_H__6ACE3589_24B6_466C_921F_DCA4CA09AC97__INCLUDED_) </span><span></span> </li> <li> <span></span><span class="preprocessor">#defineAFX_LLUHN_H__6ACE3589_24B6_466C_921F_DCA4CA09AC97__INCLUDED_ </span><span></span> </li> <li class="alt"><span></span></li> <li> <span></span><span class="preprocessor">#if_MSC_VER&gt;1000 </span><span></span> </li> <li class="alt"> <span></span><span class="preprocessor">#pragmaonce </span><span></span> </li> <li> <span></span><span class="preprocessor">#endif//_MSC_VER&gt;1000 </span><span></span> </li> <li class="alt"><span></span></li> <li> <span></span><span class="keyword">class</span><span>LLUHN</span> </li> <li class="alt"><span>{</span></li> <li> <span></span><span class="keyword">public</span><span>:</span> </li> <li class="alt"> <span></span><span class="keyword">const</span><span>CStringGetCardNum();</span> </li> <li> <span></span><span class="datatypes">char</span><span>GetCheckSum();</span> </li> <li class="alt"> <span></span><span class="datatypes">BOOL</span><span>IsValid();</span> </li> <li> <span></span><span class="datatypes">BOOL</span><span>SetCardNum(CStringstrCardNum);</span> </li> <li class="alt"><span>LLUHN();</span></li> <li><span>LLUHN(CStringstrCardNum);</span></li> <li class="alt"> <span></span><span class="keyword">virtual</span><span>~LLUHN();</span> </li> <li> <span></span><span class="keyword">private</span><span>:</span> </li> <li class="alt"><span>CStringm_strCardNum;</span></li> <li><span>};</span></li> <li class="alt"><span></span></li> <li> <span></span><span class="preprocessor">#endif//!defined(AFX_LLUHN_H__6ACE3589_24B6_466C_921F_DCA4CA09AC97__INCLUDED_) </span><span></span> </li> </ol> </div> <p class="alt"><span>参考资料:见 <strong>Luhn algorithm</strong> <a href="http://en.wikipedia.org/wiki/Luhn_algorithm">http://en.wikipedia.org/wiki/Luhn_algorithm</a></span></p></span></span> </wbr></wbr></wbr>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值