Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9018[/thread]

hexdigest



<< >> 7 Einträge, 1 Seite
Froschpopo
 2007-05-19 16:22
#76771 #76771
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Warum hat eine MySQL-LongBlob-Spalte eine andere MD5-Prüfsumme, als das File auf der Festplatte?
Kann es sein, dass mySQL da noch irgendwas hinzufügt was die Prüfsumme verfälscht?

habe gerade mal ein Foto von der Festplatte in eine LongBlob-Spalte eingelesen und dann die hexadezimale Prüfsumme von dem Foto auf Festplatte, mit dem aus der LongBlob-Spalte verglichen, mit unterschiedlichen Ergebnissen.

Könnte es vielleicht sein, dass mySQL da irgendwas, aus welchen Gründen auch immer, hinzufügt?

Das komische ist, dass SELECT MD5(bin_data) ein anderes ergebnis ergibt, als wie wenn ich die Spalte mit DBI auslese und einmal durch Digest::MD5::add() schicke.
Wobei die Angabe von MySQL wiederrum korrekt ist.\n\n

<!--EDIT|Froschpopo|1179578876-->
GwenDragon
 2007-05-19 16:58
#76772 #76772
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Und wie erstellst du die Prüfsumme mit DBI und Digest::MD5?
Froschpopo
 2007-05-19 17:04
#76773 #76773
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
SELECT bin_data FROM photos

$md5 = Digest::MD5->new;
$sum = $md5->add($bin_data)->hexdigest;


ist aber nicht dasselbe wie:
Code: (dl )
SELECT MD5(bin_data)...


Erstes funktioniert aber auch auf jedenfall korrekt, aber nicht, wenn die Daten aus der LongBlob-Spalte kommen!
ich habe die ganze Zeit den Verdacht, dass mySQL da noch Leerzeichen oder sowas dranhängt diie bei der mySQL-eigenen-MD5-Funktion subtrahiert werden.\n\n

<!--EDIT|Froschpopo|1179579892-->
GwenDragon
 2007-05-19 18:44
#76774 #76774
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ich weiß nicht, was du programmiert hast.
Aber bei mir läuft das Test-Skript wie folgt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/perl

$| = 1;

use strict;
use warnings;

use Digest::MD5;
use DBI;

my $data_source = 'dbi:mysql:test';
my $username = 'test';
my $password = 'test';
my $buffer;

my $dbh = DBI->connect($data_source, $username, $password) or die $DBI::errstr;

my $rv = $dbh->do(<<"SQL") or die $DBI::errstr;
CREATE TABLE
   IF NOT EXISTS test (
    id INT,
    myData LONGBLOB,
    myName CHAR(64),
    myMd5 CHAR(128)
   );
SQL

my ($md5,$sum);
my $sth;

for my $j (1..10) {
   my $rnd = rand(time());
   my $i = $j + int($rnd);
   
   $buffer = 'XFCE#'. chr(rand(100)) . '(123a3#aA2' . "\xAA" . "\011" . '211x0|c' . chr(rand(100)) . '022' . "\xDF" . "171" .  chr(rand(100)) . "616" . $rnd;
   
   $md5 = Digest::MD5->new;
   $md5->add($buffer);
   $sum = $md5->hexdigest;
   
   $sth = $dbh->prepare(<<SQL) or die $DBI::errstr;
   INSERT INTO test ( id, myData, myName, myMd5 )
   VALUES ( ?, ?, ?, ?);
SQL
   $rv = $sth->execute($i, $buffer, $rnd, $sum) or die $DBI::errstr;;
}
   
$sth = $dbh->prepare(<<SQL) or die $DBI::errstr;
SELECT myData,myMd5,MD5(myData),id from test;
SQL
$rv = $sth->execute() or die $DBI::errstr;
while (my @row = $sth->fetchrow_array) {
   $buffer = $row[0];
   $md5 = Digest::MD5->new;
   $md5->add($buffer);
   $sum = $md5->hexdigest;

   print $row[3], ':  ';
   die if $row[1] ne $row[2]; # gespeicherte MD5 ungleich durch MySQL errechnete?
   die if $sum ne $row[2]; # durch Digest::MD5($buffer) errechnete MD5 ungleich durch MySQL errechnete?
   print "ok", "\n";
}

1;


Icxh kann da sowohl in Perl5.6.1 als auch Perl5.8. mit mySQL4 und MySQL5 nichts endecken, was eine falsche Prüfsumme erzeugen könnte.

MySQL DBI DBD::Mysql
4.1.21 1.53 4.004
5.0.26 1.54 4.004
\n\n

<!--EDIT|GwenDragon|1179589010-->
GwenDragon
 2007-05-19 19:38
#76775 #76775
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,19.05.2007, 15:04]
Code: (dl )
1
2
3
4
SELECT bin_data FROM photos

$md5 = Digest::MD5->new;
$sum = $md5->add($bin_data)->hexdigest;
[/quote]
Bisschen mager der Code.

Irgendwo muss ja dein Denk-/Code-Fehler drin sein.

//EDIT: Ich habe auch mal ein paar Bilder in die Datenbank gespeichert und dann die MD5 getestet.
Geht auch mit meinem Skript so wie es soll.\n\n

<!--EDIT|GwenDragon|1179597107-->
Strat
 2007-05-20 12:17
#76776 #76776
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
vergleiche einfach mal die beiden binaeren strings, dann siehst du, wo der unterschied ist...

hast du $binData von einer Datei eingelesen? wenn ja, hast du den filehandle auf binmode gesetzt? wenn man sowas vergisst, ist es unter windows fatal, weil du nicht den string bekommst, den du haben willst.\n\n

<!--EDIT|Strat|1179649135-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
GwenDragon
 2007-05-20 12:34
#76777 #76777
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Beispiel-Schnippsel zum Einlesen einer Bilddatei in die DB:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    
#<snip>
#
my $rnd = rand(time());
my $i = int($rnd);

my $FH;
open($FH, 'picture.png') or die $!;
binmode($FH);
local ($/) = undef;
$buffer = <$FH>;
close($FH) or die $!;
$md5 = Digest::MD5->new;
$md5->add($buffer);
$sum = $md5->hexdigest;

$sth = $dbh->prepare(<<SQL) or die $DBI::errstr;
INSERT INTO test
( id, myData, myName, myMd5 )
VALUES ( ?, ?, ?, ?);
SQL
$rv = $sth->execute($i, $buffer, $rnd, $sum) or die $DBI::errstr;
#<snip>
<< >> 7 Einträge, 1 Seite



View all threads created 2007-05-19 16:22.