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

Shorthash - kann mir jemand dieses Skript erklären



<< >> 3 Einträge, 1 Seite
Wlet
 2006-05-31 12:14
#66805 #66805
User since
2006-05-24
15 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin auf der suche nach einer Methode, relativ kurze Hashes zu erzeugen, die mir als Dateinamen dienen sollen. Nun habe ich folgendes Skript gefunden, aber die letzte Zeile geht mir nicht in den Kopf:

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
#!/usr/bin/perl -w
#
# $Id: shorthash,v 1.2 2003/08/01 02:10:57 jmates Exp $
#
# The author disclaims all copyrights and releases this script into the
# public domain.
#
# Generates short (eight character) hashes from MD5 hex signatures.

require 5;
use strict;

use Digest::MD5;

my $fh;

if (@ARGV) {
my $file = shift;

open $fh, $file or die "error: could not open $file: $!\n";
binmode $fh;
} else {
$fh = *STDIN;
}

printf "%08x\n", unpack "N", Digest::MD5->new->addfile($fh)->digest;


Alles darüber ist soweit klar. Aber die Print-Anweisung kapiere ich nicht so ganz.

%08x -> hat wohl die Bedeutung, dass 8 Stellen Hexadezimal angezeigt werden sollen
unpack "N" -> Hier blick ichs garnicht. Wieso "N"? was für eine Beutung hat das Unpack im Kontext?
Digest::MD5->new->addfile($fh)->digest; -> erzeugt den eigentlichen Hashwert

Wer kann mir den Klaps auf den Hinterkopf geben?

Wlet
Taulmarill
 2006-05-31 13:39
#66806 #66806
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
da die digest funktion von Digest::MD5 binäre daten zurück gibt, werden diese mit unpack in einen numerischen wert entpackt. "N" steht hier für
Quote
An unsigned long in "network" (big-endian) order.

imho ist das irgendwie zu kompliziert gelöst. versuch mal folgendes:
Code: (dl )
print Digest::MD5->new->addfile($fh)->hexdigest;

wenn dir der string zu lang ist, kannst du ihn ja bit substr noch weiter verkürzen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Wlet
 2006-05-31 15:39
#66807 #66807
User since
2006-05-24
15 Artikel
BenutzerIn
[default_avatar]
Danke!

D.h. ich müsste diesen Ausdruck eigentlich geklammert sehen?

printf "%08x\n", (unpack ("N", Digest::MD5->new->addfile($fh)->digest));

So macht das schon wesentlich mehr Sinn...

Wlet
<< >> 3 Einträge, 1 Seite



View all threads created 2006-05-31 12:14.