in reply to Re^2: Algorithm Showdown: Fuzzy Matching (Matcher.pm)
in thread Algorithm Showdown: Fuzzy Matching
This is an improved version of the Xor attack. I will leave it to BrowserUk to explain in more detail.
package Fuzzy::Matcher::Xor2; use strict; use warnings; use Fuzzy::Matcher; use vars qw/$VERSION @ISA/; @ISA=qw(Fuzzy::Matcher); $VERSION=0.01; # Original implementation by [BrowserUk] # bugfixes and modified to fit Fuzzy::Matcher interface by [demerphq] sub _init { my ($self)=@_; $self->{minZeros} = chr( 0 ) x int( $self->{strlen} / ( $self->{fuzz +} + 1 ) ); $self->{minZlen} = length $self->{minZeros}; } sub fuzz_search { my ($self,$seq)=@_; use bytes; my $FUZZY = $self->{fuzz}; my $seqLen = length $seq; my $keyLen = $self->{strlen}; my $minZeros = $self->{minZeros}; my $minZlen = $self->{minZlen}; my ($masked,$pos); my @matches; for my $key ( @{$self->{str_array}} ) { my $mask = $key x ( int( $seqLen / $keyLen ) + 1 ); my $maskLen = length $mask; for my $offset1 ( 0 .. $keyLen-1 ) { $masked = $mask ^ substr( $seq, $offset1, $maskLen ); $pos = 0; while( $pos = 1+index $masked, $minZeros, $pos ) { $pos--; my $offset2 = $pos - ($pos % $keyLen ); last if $offset1+$offset2+$keyLen>$seqLen; my $fuz = $keyLen - ( substr( $masked, $offset2, $keyLen ) =~ tr[\0][\0] ); if( $fuz <= $FUZZY ) { push @matches,$offset1 + $offset2,$fuz,$key; } $pos = $offset2 + $keyLen; } } } return \@matches; } 1;
|
|---|