]> gitweb.factorcode.org Git - factor.git/commitdiff
generalize sha1-interleave and move it to its own vocabulary
authorDoug Coleman <erg@jobim.local>
Sun, 17 May 2009 18:49:56 +0000 (13:49 -0500)
committerDoug Coleman <erg@jobim.local>
Sun, 17 May 2009 18:49:56 +0000 (13:49 -0500)
basis/checksums/interleave/authors.txt [new file with mode: 0644]
basis/checksums/interleave/interleave-tests.factor [new file with mode: 0644]
basis/checksums/interleave/interleave.factor [new file with mode: 0644]

diff --git a/basis/checksums/interleave/authors.txt b/basis/checksums/interleave/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
diff --git a/basis/checksums/interleave/interleave-tests.factor b/basis/checksums/interleave/interleave-tests.factor
new file mode 100644 (file)
index 0000000..060d359
--- /dev/null
@@ -0,0 +1,19 @@
+! Copyright (C) 2009 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: tools.test checksums.interleave checksums.sha1 ;
+IN: checksums.interleave.tests
+
+[
+    B{
+        59 155 253 205 75 163 94 115 208 42 227 92 181 19 60 232
+        119 65 178 131 210 48 241 230 204 216 30 156 4 215 80 84 93
+        206 44 1 18 128 150 153
+    }
+] [
+    B{
+        102 83 241 12 26 250 181 76 97 200 37 117 168 74 254 48 216
+        170 26 58 150 150 179 24 153 146 191 225 203 127 166 167
+    }
+    sha1 interleaved-checksum
+] unit-test
+
diff --git a/basis/checksums/interleave/interleave.factor b/basis/checksums/interleave/interleave.factor
new file mode 100644 (file)
index 0000000..caef033
--- /dev/null
@@ -0,0 +1,17 @@
+! Copyright (C) 2009 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: assocs checksums grouping kernel locals math sequences ;
+IN: checksums.interleave
+
+: seq>2seq ( seq -- seq1 seq2 )
+    #! { abcdefgh } -> { aceg } { bdfh }
+    2 group flip [ { } { } ] [ first2 ] if-empty ;
+
+: 2seq>seq ( seq1 seq2 -- seq )
+    #! { aceg } { bdfh } -> { abcdefgh }
+    [ zip concat ] keep like ;
+
+:: interleaved-checksum ( bytes checksum -- seq )
+    bytes [ zero? ] trim-head
+    dup length odd? [ rest-slice ] when
+    seq>2seq [ checksum checksum-bytes ] bi@ 2seq>seq ;