Τη Τρίτη, 22 Ιανουαρίου 2013 9:16:34 μ.μ. UTC+2, ο χρήστης Peter Otten έγραψε: > Ferrous Cranus wrote: > > > > > Τη Τρίτη, 22 Ιανουαρίου 2013 6:11:20 μ.μ. UTC+2, ο χρήστης Chris Angelico > > > έγραψε: > > > > >> all of it. You are asking something that is fundamentally > > >> impossible[1]. There simply are not enough numbers to go around. > > > > > Fundamentally impossible? > > > > > > Well.... > > > > > > OK: How about this in Perl: > > > > > > $ cat testMD5.pl > > > use strict; > > > > > > foreach my $url(qw@ /index.html /about/time.html @){ > > > hashit($url); > > > } > > > > > > sub hashit { > > > my $url=shift; > > > my @ltrs=split(//,$url); > > > my $hash = 0; > > > > > > foreach my $ltr(@ltrs){ > > > $hash = ( $hash + ord($ltr)) %10000; > > > } > > > printf "%s: %0.4d\n",$url,$hash > > > > > > } > > > > > > > > > which yields: > > > $ perl testMD5.pl > > > /index.html: 1066 > > > /about/time.html: 1547 > > > > $ cat clashes.pl > > use strict; > > > > foreach my $url(qw@ > > /public/fails.html > > /large/cannot.html > > /number/being.html > > /hope/already.html > > /being/really.html > > /index/breath.html > > /can/although.html > > @){ > > hashit($url); > > } > > > > sub hashit { > > my $url=shift; > > my @ltrs=split(//,$url); > > my $hash = 0; > > > > foreach my $ltr(@ltrs){ > > $hash = ( $hash + ord($ltr)) %10000; > > } > > printf "%s: %0.4d\n",$url,$hash > > > > } > > $ perl clashes.pl > > /public/fails.html: 1743 > > /large/cannot.html: 1743 > > /number/being.html: 1743 > > /hope/already.html: 1743 > > /being/really.html: 1743 > > /index/breath.html: 1743 > > /can/although.html: 1743 > > > > Hm, I must be holding it wrong...
my @i = split(//,$url); # put each letter in it's own bin my $j=0; # Initailize our my $k=1; # hashing increment values my @m=(); # workspace foreach my $n(@i){ my $q=ord($n); # ASCII for character $k += $j; # Increment our hash offset $q += $k; # add our "old" value $j = $k; # store that. push @m,$q; # save the offsetted value } my $hashval=0; #initialize our hash value # Generate that map { $hashval = ($hashval + $_) % 10000} @m; Using that method ABC.html and CBA.html now have different values because each letter position's value gets bumped up increasingly from left to right. -- http://mail.python.org/mailman/listinfo/python-list