LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 836|回复: 0

perl语言编程-MD5应用篇

[复制链接]
发表于 2004-11-25 13:39:59 | 显示全部楼层 |阅读模式

  1. MD5算法是目前广为使用的杂凑算法,它一度被视为是牢不可破的。
  2. 然而这个神话在今年8月份轰然倒塌,中国王小云教授的一篇论文
  3. 宣告了它使命的终结。然而作为一种优秀的算法,在一定的领域内
  4. 它依然有着无可替代的作用。

  5. 在实际环境中,遇到这样一个问题。某公司的数据库为ora8,计划
  6. 升级为ora9i,由于数据库版本跨度大且为海量数据,计划由dsg软
  7. 件进行数据迁移。但在dsg测试中发现有数据丢失现象。现在要求
  8. 提供一种手段对迁移前后的数据进行比较验证,确保万无一失。
  9. 考虑到网上文件发布共享时广泛使用MD5提供对自身校验,显然这里
  10. 情况极为类似。

  11. 程序设计如下:打开一对管道,由父进程进行数据提取操作,传入
  12. 管道。子进程进行MD5校验。源码如下:

  13. unix# cat checkMD5

  14. #!/bin/perl

  15. use DBI;
  16. #use Proc::Fork;
  17. use IO::Pipe;
  18. use Digest::MD5;

  19. my $dbuser="test";
  20. my $passwd="test";
  21. my $dbstr="dbi:Oracle:ora8";

  22. my $sql=shift or die "I need a sql string\n" ;


  23. pipe(PIPE_READ,PIPE_WRITE) or die "Can't make pipe!\n";

  24. if ($pid = fork) {

  25.         close(PIPE_READ);

  26.         my $dbh = DBI->connect ($dbstr, $dbuser, $passwd,
  27.             { RaiseError => 1, AutoCommit => 0 }) || die "$DBI::errstr";
  28.         my $sth = $dbh->prepare($sql); $sth->execute();
  29.         while(my @result=$sth->fetchrow_array){
  30.                 print PIPE_WRITE @result,"\n";
  31.         }
  32.         $dbh->disconnect();
  33.         close(PIPE_WRITE);
  34.         exit;

  35. } else {

  36.         defined $pid or die "can't fork:$!\n";
  37.         close(PIPE_WRITE);
  38.         binmode(PIPE_READ);
  39.         print Digest::MD5->new->addfile(*PIPE_READ)->b64digest, "\n";
  40.         close(PIPE_READ);
  41.         exit;
  42. }

  43. 执行方法:perl checkMD5 "select * from test order by id"
  44. 该程序将会对 sql 语句的结果集进行 md5 校验,生成唯一的校验值。

  45. 缺点:1.结果集必须完全一致,因此要对主键进行排序。
  46.       2.对于千万级别的表,处理时间太长。
  47.       
  48. 改进方法:1.采用其他算法,在《应用密码学》一书中提到了一种杂凑算法,
  49.        与顺序无关。但没有找到进一步的资料,因此暂时用MD5 算法。希望
  50.        了解的朋友不吝赐教。
  51.        2.拟采用多进程方式,将ID值分成多个区间,并发查询。此是后话。
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表