;basic idea for SIFT3 code by Siderite Zackwehdex ;http://siderite.blogspot.com/2007/04/super-fast-and-accurate-string-distance.html ;took idea to normalize it to longest string from Brad Wood ;http://www.bradwood.com/string_compare/ ;Own work: ; - when character only differ in case, LSC is a 0.8 match for this character ; - modified code for speed, might lead to different results compared to original code ; - optimized for speed (30% faster then original SIFT3 and 13.3 times faster than basic Levenshtein distance) ;http://www.autohotkey.com/forum/topic59407.html Difference(string1, string2, maxOffset=5) { ;returns a float: between "0.0 = identical" and "1.0 = nothing in common" If (string1 = string2) Return (string1 == string2 ? 0/1 : 0.2/StrLen(string1)) ;either identical or (assumption:) "only one" char with different case If (string1 = "" OR string2 = "") Return (string1 = string2 ? 0/1 : 1/1) StringSplit, n, string1 StringSplit, m, string2 ni := 1, mi := 1, lcs := 0 While((ni <= n0) AND (mi <= m0)) { If (n%ni% == m%mi%) EnvAdd, lcs, 1 Else If (n%ni% = m%mi%) EnvAdd, lcs, 0.8 Else{ Loop, %maxOffset% { oi := ni + A_Index, pi := mi + A_Index If ((n%oi% = m%mi%) AND (oi <= n0)){ ni := oi, lcs += (n%oi% == m%mi% ? 1 : 0.8) Break } If ((n%ni% = m%pi%) AND (pi <= m0)){ mi := pi, lcs += (n%ni% == m%pi% ? 1 : 0.8) Break } } } EnvAdd, ni, 1 EnvAdd, mi, 1 } Return ((n0 + m0)/2 - lcs) / (n0 > m0 ? n0 : m0) }