北京市小汽车摇号程序的反编译、算法及存在的问题浅析

北京市摇号网站(bjhjyd.gov.cn)在2014年2月26号第一期摇号后公布了摇号程序及当期摇号数据。由于笔者也是百万摇号大军中的一员,于是第一时间下载了程序,并通过.Net Reflector对程序进行了反编译和简单分析,详情如下:
1.登录北京市摇号网站,下载摇号程序及数据

 2.程序文件和数据下载解压后如下图所示,其中CarQuotaNoPickPublic为摇号程序,ICsharpCode.SharpZipLib.dll是.NET常用的解压缩类库。另外一个是当期的摇号数据包,包含了所有申请人的申请编码和序号。

3.解压数据文件,里面是包含当期所有摇号数据的CSV文件

4.所有人的序号按照申请编码大小依序排列,比如2014年第一期,所有序号为从1到2235804。后面会提到,摇号其实不是根据申请编码,而是根据申请编码排序后的序号进行随机抽取的。

5.摇号程序界面,进过实验,的确可以得出和官方一致的结果(提前剧透,由于摇号程序中使用了Random类,该类返回的是伪随机序列,所以当种子数一定的时候,返回的结果总是一样的)。

6.使用.Net Refector对CarQuotaNoPickPublic.exe进行反编译,可以说代码质量惨不忍睹,不过靠垄断吃饭的行业,要求也不必高。问题在后面
   通过分析,发现关键的摇号算法在GetRandomNumber()函数内实现,其中的参数allRandomPickData.seed是当期的种子 基数(2014年第一期为026498), allRandomPickData.TotalNumber是当期的摇号总数(2014年第一期为 2235804),allRandomPickData.QuotaNumber为可配置的指标总数(2014年第一期为20195)。
  通过反编译后的代码可以看到,该摇号算法只是简单的使用了C#中的Random类,通过Random.Next(2235804)方法,从2235804个申请人中抽取20195个编码

7.始终木有发现两、三倍中签概率在算法上体现在哪里??各位有看到的请指教

小结,通过对代码的分析可以看出该摇号程序一是相当的随便和不严谨,二是代码质量非常初级。关系到首都200万群众切身利益的程序都可以这么粗糙,管中窥 豹,可以看出政府信息化中潜藏的问题。本文也是抛砖引玉,希望引起有关部门重视,不要让IT成为政策有效执行的最后一公里。

猜你喜欢

转载自fengpy2009.iteye.com/blog/2034706