diff --git a/basis/checksums/fnv1/authors.txt b/basis/checksums/fnv1/authors.txt new file mode 100644 index 0000000000..c64bb4e735 --- /dev/null +++ b/basis/checksums/fnv1/authors.txt @@ -0,0 +1 @@ +Alaric Snell-Pym \ No newline at end of file diff --git a/basis/checksums/fnv1/fnv1-docs.factor b/basis/checksums/fnv1/fnv1-docs.factor new file mode 100644 index 0000000000..4fbecd2b75 --- /dev/null +++ b/basis/checksums/fnv1/fnv1-docs.factor @@ -0,0 +1,67 @@ +USING: help.markup help.syntax ; +IN: checksums.fnv1 + +HELP: fnv1-32 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1, 32-bit." } ; + +HELP: fnv1a-32 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1a, 32-bit." } ; + + +HELP: fnv1-64 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1, 64-bit." } ; + +HELP: fnv1a-64 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1a, 64-bit." } ; + + +HELP: fnv1-128 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1, 128-bit." } ; + +HELP: fnv1a-128 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1a, 128-bit." } ; + + +HELP: fnv1-256 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1, 256-bit." } ; + +HELP: fnv1a-256 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1a, 256-bit." } ; + + +HELP: fnv1-512 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1, 512-bit." } ; + +HELP: fnv1a-512 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1a, 512-bit." } ; + + +HELP: fnv1-1024 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1, 1024-bit." } ; + +HELP: fnv1a-1024 +{ $class-description "Fowler-Noll-Vo checksum algorithm, v1a, 1024-bit." } ; + +ARTICLE: "checksums.fnv1" "Fowler-Noll-Vo checksum" + "The Fowler-Noll-Vo checksum algorithm is another simple and fast checksum. It comes in 32, 64, 128, 256, 512 and 1024-bit versions, each in 1 and 1a variants. The 1a variants tend to produce a slightly better result. See http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash for more details." + + { $subsection fnv1-32 } + { $subsection fnv1a-32 } + + { $subsection fnv1-64 } + { $subsection fnv1a-64 } + + { $subsection fnv1-128 } + { $subsection fnv1a-128 } + + { $subsection fnv1-256 } + { $subsection fnv1a-256 } + + { $subsection fnv1-512 } + { $subsection fnv1a-512 } + + { $subsection fnv1-1024 } + { $subsection fnv1a-1024 } + ; + +ABOUT: "checksums.fnv1" diff --git a/basis/checksums/fnv1/fnv1-tests.factor b/basis/checksums/fnv1/fnv1-tests.factor new file mode 100644 index 0000000000..de665a1547 --- /dev/null +++ b/basis/checksums/fnv1/fnv1-tests.factor @@ -0,0 +1,41 @@ +USING: checksums.fnv1 checksums strings tools.test ; +IN: checksums.fnv1.tests + +! A few test vectors taken from http://www.isthe.com/chongo/src/fnv/test_fnv.c + +[ HEX: 811c9dc5 ] [ "" fnv1-32 checksum-bytes ] unit-test +[ HEX: 811c9dc5 ] [ "" fnv1a-32 checksum-bytes ] unit-test +[ HEX: cbf29ce484222325 ] [ "" fnv1-64 checksum-bytes ] unit-test +[ HEX: cbf29ce484222325 ] [ "" fnv1a-64 checksum-bytes ] unit-test + +[ HEX: 050c5d7e ] [ "a" fnv1-32 checksum-bytes ] unit-test +[ HEX: e40c292c ] [ "a" fnv1a-32 checksum-bytes ] unit-test +[ HEX: af63bd4c8601b7be ] [ "a" fnv1-64 checksum-bytes ] unit-test +[ HEX: af63dc4c8601ec8c ] [ "a" fnv1a-64 checksum-bytes ] unit-test + +[ HEX: 050c5d7d ] [ "b" fnv1-32 checksum-bytes ] unit-test +[ HEX: e70c2de5 ] [ "b" fnv1a-32 checksum-bytes ] unit-test +[ HEX: af63bd4c8601b7bd ] [ "b" fnv1-64 checksum-bytes ] unit-test +[ HEX: af63df4c8601f1a5 ] [ "b" fnv1a-64 checksum-bytes ] unit-test + +[ HEX: 31f0b262 ] [ "foobar" fnv1-32 checksum-bytes ] unit-test +[ HEX: bf9cf968 ] [ "foobar" fnv1a-32 checksum-bytes ] unit-test +[ HEX: 340d8765a4dda9c2 ] [ "foobar" fnv1-64 checksum-bytes ] unit-test +[ HEX: 85944171f73967e8 ] [ "foobar" fnv1a-64 checksum-bytes ] unit-test + +! I couldn't find any test vectors for 128, 256, 512, or 1024 versions of FNV1 hashes. +! So, just to check that your maths works the same as my maths, here's a few samples computed on my laptop. +! So they may be right or wrong, but either way, them failing is cause for concern somewhere... + +[ 3897470310 ] [ "Hello, world!" fnv1-32 checksum-bytes ] unit-test +[ 3985698964 ] [ "Hello, world!" fnv1a-32 checksum-bytes ] unit-test +[ 7285062107457560934 ] [ "Hello, world!" fnv1-64 checksum-bytes ] unit-test +[ 4094109891673226228 ] [ "Hello, world!" fnv1a-64 checksum-bytes ] unit-test +[ 281580511747867177735318995358496831158 ] [ "Hello, world!" fnv1-128 checksum-bytes ] unit-test +[ 303126633380056630368940439484674414572 ] [ "Hello, world!" fnv1a-128 checksum-bytes ] unit-test +[ 104295939182568077644846978685759236849634734810631820736486253421270219742822 ] [ "Hello, world!" fnv1-256 checksum-bytes ] unit-test +[ 9495445728692795332446740615588417456874414534608540692485745371050033741380 ] [ "Hello, world!" fnv1a-256 checksum-bytes ] unit-test +[ 3577308325596719252093726711895047340166329831006673109476042102918876665433235513101496175651226507162015890004121912850661561110326527625579463564626958 ] [ "Hello, world!" fnv1-512 checksum-bytes ] unit-test +[ 3577308325596719162840652138474318309664256091923081930027929425092517582111473988451078821416039944023089883981242376700859598441397004715365740906054208 ] [ "Hello, world!" fnv1a-512 checksum-bytes ] unit-test +[ 52692754922840008511959888105094366091401994235075816792707658326855733053286986999719949898492311786648795846192078757217437117165934438286601534984230194601365788544275827382423366672856972872132009691615382991251544423521887009322211754219117294019951276080952271766377222613325328591830596794468813260226 ] [ "Hello, world!" fnv1-1024 checksum-bytes ] unit-test +[ 52692754922840008511959888105094366091401994235075816792707658326855804920671100511873485674717442819607149127986090276849364757610838433887624184145636764448608707614141109841761957788887305179569455221243999538336208648824673027111352338809582124430199044921035232455717748500524777795242051756321605065326 ] [ "Hello, world!" fnv1a-1024 checksum-bytes ] unit-test diff --git a/basis/checksums/fnv1/fnv1.factor b/basis/checksums/fnv1/fnv1.factor new file mode 100644 index 0000000000..f221cefef2 --- /dev/null +++ b/basis/checksums/fnv1/fnv1.factor @@ -0,0 +1,106 @@ +! Copyright (C) 2009 Alaric Snell-Pym +! See http://factorcode.org/license.txt for BSD license. + +USING: checksums classes.singleton kernel math math.ranges +math.vectors sequences ; + +IN: checksums.fnv1 + +SINGLETON: fnv1-32 +SINGLETON: fnv1a-32 +SINGLETON: fnv1-64 +SINGLETON: fnv1a-64 +SINGLETON: fnv1-128 +SINGLETON: fnv1a-128 +SINGLETON: fnv1-256 +SINGLETON: fnv1a-256 +SINGLETON: fnv1-512 +SINGLETON: fnv1a-512 +SINGLETON: fnv1-1024 +SINGLETON: fnv1a-1024 + +CONSTANT: fnv1-32-prime 16777619 +CONSTANT: fnv1-64-prime 1099511628211 +CONSTANT: fnv1-128-prime 309485009821345068724781371 +CONSTANT: fnv1-256-prime 374144419156711147060143317175368453031918731002211 +CONSTANT: fnv1-512-prime 35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852759 +CONSTANT: fnv1-1024-prime 5016456510113118655434598811035278955030765345404790744303017523831112055108147451509157692220295382716162651878526895249385292291816524375083746691371804094271873160484737966720260389217684476157468082573 + +CONSTANT: fnv1-32-mod HEX: ffffffff +CONSTANT: fnv1-64-mod HEX: ffffffffffffffff +CONSTANT: fnv1-128-mod HEX: ffffffffffffffffffffffffffffffff +CONSTANT: fnv1-256-mod HEX: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +CONSTANT: fnv1-512-mod HEX: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +CONSTANT: fnv1-1024-mod HEX: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +CONSTANT: fnv1-32-basis HEX: 811c9dc5 +CONSTANT: fnv1-64-basis HEX: cbf29ce484222325 +CONSTANT: fnv1-128-basis HEX: 6c62272e07bb014262b821756295c58d +CONSTANT: fnv1-256-basis HEX: dd268dbcaac550362d98c384c4e576ccc8b1536847b6bbb31023b4c8caee0535 +CONSTANT: fnv1-512-basis HEX: b86db0b1171f4416dca1e50f309990acac87d059c90000000000000000000d21e948f68a34c192f62ea79bc942dbe7ce182036415f56e34bac982aac4afe9fd9 +CONSTANT: fnv1-1024-basis HEX: 5f7a76758ecc4d32e56d5a591028b74b29fc4223fdada16c3bf34eda3674da9a21d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c6d7eb6e73802734510a555f256cc005ae556bde8cc9c6a93b21aff4b16c71ee90b3 + +M: fnv1-32 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-32-basis swap + [ swap fnv1-32-prime * bitxor fnv1-32-mod bitand ] each ; + +M: fnv1a-32 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-32-basis swap + [ bitxor fnv1-32-prime * fnv1-32-mod bitand ] each ; + + +M: fnv1-64 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-64-basis swap + [ swap fnv1-64-prime * bitxor fnv1-64-mod bitand ] each ; + +M: fnv1a-64 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-64-basis swap + [ bitxor fnv1-64-prime * fnv1-64-mod bitand ] each ; + + +M: fnv1-128 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-128-basis swap + [ swap fnv1-128-prime * bitxor fnv1-128-mod bitand ] each ; + +M: fnv1a-128 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-128-basis swap + [ bitxor fnv1-128-prime * fnv1-128-mod bitand ] each ; + + +M: fnv1-256 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-256-basis swap + [ swap fnv1-256-prime * bitxor fnv1-256-mod bitand ] each ; + +M: fnv1a-256 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-256-basis swap + [ bitxor fnv1-256-prime * fnv1-256-mod bitand ] each ; + + +M: fnv1-512 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-512-basis swap + [ swap fnv1-512-prime * bitxor fnv1-512-mod bitand ] each ; + +M: fnv1a-512 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-512-basis swap + [ bitxor fnv1-512-prime * fnv1-512-mod bitand ] each ; + + +M: fnv1-1024 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-1024-basis swap + [ swap fnv1-1024-prime * bitxor fnv1-1024-mod bitand ] each ; + +M: fnv1a-1024 checksum-bytes ( bytes checksum -- value ) + drop + fnv1-1024-basis swap + [ bitxor fnv1-1024-prime * fnv1-1024-mod bitand ] each ; diff --git a/basis/checksums/fnv1/summary.txt b/basis/checksums/fnv1/summary.txt new file mode 100644 index 0000000000..2c74cda8cd --- /dev/null +++ b/basis/checksums/fnv1/summary.txt @@ -0,0 +1 @@ +Fowler-Noll-Vo checksum algorithm