diff --git a/basis/checksums/fletcher/authors.txt b/basis/checksums/fletcher/authors.txt new file mode 100644 index 0000000000..e091bb8164 --- /dev/null +++ b/basis/checksums/fletcher/authors.txt @@ -0,0 +1 @@ +John Benediktsson diff --git a/basis/checksums/fletcher/fletcher-docs.factor b/basis/checksums/fletcher/fletcher-docs.factor new file mode 100644 index 0000000000..82d111aebb --- /dev/null +++ b/basis/checksums/fletcher/fletcher-docs.factor @@ -0,0 +1,17 @@ +USING: help.markup help.syntax ; +IN: checksums.fletcher + +HELP: fletcher-16 +{ $class-description "Fletcher's 16-bit checksum algorithm." } ; + +HELP: fletcher-32 +{ $class-description "Fletcher's 32-bit checksum algorithm." } ; + +HELP: fletcher-64 +{ $class-description "Fletcher's 64-bit checksum algorithm." } ; + +ARTICLE: "checksums.fletcher" "Fletcher's checksum" +"The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John G. Fletcher at Lawrence Livermore Labs in the late 1970s." +{ $subsections fletcher-16 fletcher-32 fletcher-64 } ; + +ABOUT: "checksums.fletcher" diff --git a/basis/checksums/fletcher/fletcher-tests.factor b/basis/checksums/fletcher/fletcher-tests.factor new file mode 100644 index 0000000000..8f3a1f0421 --- /dev/null +++ b/basis/checksums/fletcher/fletcher-tests.factor @@ -0,0 +1,10 @@ +USING: checksums kernel sequences tools.test ; +IN: checksums.fletcher + +{ + { 51440 3948201259 14034561336514601929 } +} [ + "abcde" { fletcher-16 fletcher-32 fletcher-64 } + [ checksum-bytes ] with map +] unit-test + diff --git a/basis/checksums/fletcher/fletcher.factor b/basis/checksums/fletcher/fletcher.factor new file mode 100644 index 0000000000..257912d8a8 --- /dev/null +++ b/basis/checksums/fletcher/fletcher.factor @@ -0,0 +1,27 @@ +! Copyright (C) 2013 John Benediktsson +! See http://factorcode.org/license.txt for BSD license + +USING: checksums grouping io.binary kernel locals math sequences +; + +IN: checksums.fletcher + +SINGLETON: fletcher-16 +SINGLETON: fletcher-32 +SINGLETON: fletcher-64 + +INSTANCE: fletcher-16 checksum +INSTANCE: fletcher-32 checksum +INSTANCE: fletcher-64 checksum + +:: fletcher ( seq k -- n ) + k 16 / :> chars + k 2 / 2^ :> base + base 1 - :> modulo + 0 0 seq chars [ + be> + modulo mod [ + modulo mod ] keep + ] each [ base * ] [ + ] bi* ; inline + +M: fletcher-16 checksum-bytes drop 16 fletcher ; +M: fletcher-32 checksum-bytes drop 32 fletcher ; +M: fletcher-64 checksum-bytes drop 64 fletcher ; diff --git a/basis/checksums/fletcher/summary.txt b/basis/checksums/fletcher/summary.txt new file mode 100644 index 0000000000..489839537f --- /dev/null +++ b/basis/checksums/fletcher/summary.txt @@ -0,0 +1 @@ +Fletcher's checksum algorithm