Skip to content

Instantly share code, notes, and snippets.

@RobThree
Last active March 1, 2021 05:29
Show Gist options
  • Save RobThree/25d764ea6d4849fdd0c79d15cda27d61 to your computer and use it in GitHub Desktop.
Save RobThree/25d764ea6d4849fdd0c79d15cda27d61 to your computer and use it in GitHub Desktop.

Revisions

  1. RobThree renamed this gist Sep 14, 2017. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. RobThree revised this gist Sep 14, 2017. 1 changed file with 33 additions and 0 deletions.
    33 changes: 33 additions & 0 deletions check,cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,33 @@
    // Test/check FNV-1(a) hash implementations
    var testvectors = new[] { "", "a", "b", "c", "d", "e", "f", "fo", "foo", "foob", "fooba", "foobar", "\0", "a\0", "b\0", "c\0", "d\0", "e\0", "f\0", "fo\0", "foo\0", "foob\0", "fooba\0", "foobar\0", "ch", "cho", "chon", "chong", "chongo", "chongo ", "chongo w", "chongo wa", "chongo was", "chongo was ", "chongo was h", "chongo was he", "chongo was her", "chongo was here", "chongo was here!", "chongo was here!\n", "ch\0", "cho\0", "chon\0", "chong\0", "chongo\0", "chongo \0", "chongo w\0", "chongo wa\0", "chongo was\0", "chongo was \0", "chongo was h\0", "chongo was he\0", "chongo was her\0", "chongo was here\0", "chongo was here!\0", "chongo was here!\n\0", "cu", "cur", "curd", "curds", "curds ", "curds a", "curds an", "curds and", "curds and ", "curds and w", "curds and wh", "curds and whe", "curds and whey", "curds and whey\n", "cu\0", "cur\0", "curd\0", "curds\0", "curds \0", "curds a\0", "curds an\0", "curds and\0", "curds and \0", "curds and w\0", "curds and wh\0", "curds and whe\0", "curds and whey\0", "curds and whey\n\0", "hi", "hi\0", "hello", "hello\0", "\xff\x00\x00\x01", "\x01\x00\x00\xff", "\xff\x00\x00\x02", "\x02\x00\x00\xff", "\xff\x00\x00\x03", "\x03\x00\x00\xff", "\xff\x00\x00\x04", "\x04\x00\x00\xff", "\x40\x51\x4e\x44", "\x44\x4e\x51\x40", "\x40\x51\x4e\x4a", "\x4a\x4e\x51\x40", "\x40\x51\x4e\x54", "\x54\x4e\x51\x40", "127.0.0.1", "127.0.0.1\0", "127.0.0.2", "127.0.0.2\0", "127.0.0.3", "127.0.0.3\0", "64.81.78.68", "64.81.78.68\0", "64.81.78.74", "64.81.78.74\0", "64.81.78.84", "64.81.78.84\0", "feedface", "feedface\0", "feedfacedaffdeed", "feedfacedaffdeed\0", "feedfacedeadbeef", "feedfacedeadbeef\0", "line 1\nline 2\nline 3", "chongo <Landon Curt Noll> /\\../\\", "chongo <Landon Curt Noll> /\\../\\\0", "chongo (Landon Curt Noll) /\\../\\", "chongo (Landon Curt Noll) /\\../\\\0", "http://antwrp.gsfc.nasa.gov/apod/astropix.html", "http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash", "http://epod.usra.edu/", "http://exoplanet.eu/", "http://hvo.wr.usgs.gov/cam3/", "http://hvo.wr.usgs.gov/cams/HMcam/", "http://hvo.wr.usgs.gov/kilauea/update/deformation.html", "http://hvo.wr.usgs.gov/kilauea/update/images.html", "http://hvo.wr.usgs.gov/kilauea/update/maps.html", "http://hvo.wr.usgs.gov/volcanowatch/current_issue.html", "http://neo.jpl.nasa.gov/risk/", "http://norvig.com/21-days.html", "http://primes.utm.edu/curios/home.php", "http://slashdot.org/", "http://tux.wr.usgs.gov/Maps/155.25-19.5.html", "http://volcano.wr.usgs.gov/kilaueastatus.php", "http://www.avo.alaska.edu/activity/Redoubt.php", "http://www.dilbert.com/fast/", "http://www.fourmilab.ch/gravitation/orbits/", "http://www.fpoa.net/", "http://www.ioccc.org/index.html", "http://www.isthe.com/cgi-bin/number.cgi", "http://www.isthe.com/chongo/bio.html", "http://www.isthe.com/chongo/index.html", "http://www.isthe.com/chongo/src/calc/lucas-calc", "http://www.isthe.com/chongo/tech/astro/venus2004.html", "http://www.isthe.com/chongo/tech/astro/vita.html", "http://www.isthe.com/chongo/tech/comp/c/expert.html", "http://www.isthe.com/chongo/tech/comp/calc/index.html", "http://www.isthe.com/chongo/tech/comp/fnv/index.html", "http://www.isthe.com/chongo/tech/math/number/howhigh.html", "http://www.isthe.com/chongo/tech/math/number/number.html", "http://www.isthe.com/chongo/tech/math/prime/mersenne.html", "http://www.isthe.com/chongo/tech/math/prime/mersenne.html#largest", "http://www.lavarnd.org/cgi-bin/corpspeak.cgi", "http://www.lavarnd.org/cgi-bin/haiku.cgi", "http://www.lavarnd.org/cgi-bin/rand-none.cgi", "http://www.lavarnd.org/cgi-bin/randdist.cgi", "http://www.lavarnd.org/index.html", "http://www.lavarnd.org/what/nist-test.html", "http://www.macosxhints.com/", "http://www.mellis.com/", "http://www.nature.nps.gov/air/webcams/parks/havoso2alert/havoalert.cfm", "http://www.nature.nps.gov/air/webcams/parks/havoso2alert/timelines_24.cfm", "http://www.paulnoll.com/", "http://www.pepysdiary.com/", "http://www.sciencenews.org/index/home/activity/view", "http://www.skyandtelescope.com/", "http://www.sput.nl/~rob/sirius.html", "http://www.systemexperts.com/", "http://www.tq-international.com/phpBB3/index.php", "http://www.travelquesttours.com/index.htm", "http://www.wunderground.com/global/stations/89606.html" };

    var checkvalues = new[] {
    new ulong[] { 0x811c9dc5, 0x050c5d7e, 0x050c5d7d, 0x050c5d7c, 0x050c5d7b, 0x050c5d7a, 0x050c5d79, 0x6b772514, 0x408f5e13, 0xb4b1178b, 0xfdc80fb0, 0x31f0b262, 0x050c5d1f, 0x70772d5a, 0x6f772bc7, 0x6e772a34, 0x6d7728a1, 0x6c77270e, 0x6b77257b, 0x408f5e7c, 0xb4b117e9, 0xfdc80fd1, 0x31f0b210, 0xffe8d046, 0x6e772a5c, 0x4197aebb, 0xfcc8100f, 0xfdf147fa, 0xbcd44ee1, 0x23382c13, 0x846d619e, 0x1630abdb, 0xc99e89b2, 0x1692c316, 0x9f091bca, 0x2556be9b, 0x628e0e73, 0x98a0bf6c, 0xb10d5725, 0xdd002f35, 0x4197aed4, 0xfcc81061, 0xfdf1479d, 0xbcd44e8e, 0x23382c33, 0x846d61e9, 0x1630abba, 0xc99e89c1, 0x1692c336, 0x9f091ba2, 0x2556befe, 0x628e0e01, 0x98a0bf09, 0xb10d5704, 0xdd002f3f, 0x1c4a506f, 0x6e772a41, 0x26978421, 0xe184ff97, 0x9b5e5ac6, 0x5b88e592, 0xaa8164b7, 0x20b18c7b, 0xf28025c5, 0x84bb753f, 0x3219925a, 0x384163c6, 0x54f010d7, 0x8cea820c, 0xe12ab8ee, 0x26978453, 0xe184fff3, 0x9b5e5ab5, 0x5b88e5b2, 0xaa8164d6, 0x20b18c15, 0xf28025a1, 0x84bb751f, 0x3219922d, 0x384163ae, 0x54f010b2, 0x8cea8275, 0xe12ab8e4, 0x64411eaa, 0x6977223c, 0x428ae474, 0xb6fa7167, 0x73408525, 0xb78320a1, 0x0caf4135, 0xb78320a2, 0xcdc88e80, 0xb78320a3, 0x8ee1dbcb, 0xb78320a4, 0x4ffb2716, 0x860632aa, 0xcc2c5c64, 0x860632a4, 0x2a7ec4a6, 0x860632ba, 0xfefe8e14, 0x0a3cffd8, 0xf606c108, 0x0a3cffdb, 0xf906c5c1, 0x0a3cffda, 0xf806c42e, 0xc07167d7, 0xc9867775, 0xbf716668, 0xc78435b8, 0xc6717155, 0xb99568cf, 0x7662e0d6, 0x33a7f0e2, 0xc2732f95, 0xb053e78f, 0x3a19c02a, 0xa089821e, 0x31ae8f83, 0x995fa9c4, 0x35983f8c, 0x5036a251, 0x97018583, 0xb4448d60, 0x025dfe59, 0xc5eab3af, 0x7d21ba1e, 0x7704cddb, 0xd0071bfe, 0x0ff3774c, 0xb0fea0ea, 0x58177303, 0x4f599cda, 0x3e590a47, 0x965595f8, 0xc37f178d, 0x9711dd26, 0x23c99b7f, 0x6e568b17, 0x43f0245b, 0xbcb7a001, 0x12e6dffe, 0x0792f2d6, 0xb966936b, 0x46439ac5, 0x728d49af, 0xd33745c9, 0xbc382a57, 0x4bda1d31, 0xce35ccae, 0x3b6eed94, 0x445c9c58, 0x3db8bf9d, 0x2dee116d, 0xc18738da, 0x5b156176, 0x2aa7d593, 0xb2409658, 0xe1489528, 0xfe1ee07e, 0xe8842315, 0x3a6a63a2, 0x06d2c18c, 0xf8ef7225, 0x843d3300, 0xbb24f7ae, 0x878c0ec9, 0xb557810f, 0x57423246, 0x87f7505e, 0xbb809f20, 0x8932abb5, 0x0a9b3aa0, 0xb8682a24, 0xa7ac1c56, 0x11409252, },
    new ulong[] { 0x811c9dc5, 0xe40c292c, 0xe70c2de5, 0xe60c2c52, 0xe10c2473, 0xe00c22e0, 0xe30c2799, 0x6222e842, 0xa9f37ed7, 0x3f5076ef, 0x39aaa18a, 0xbf9cf968, 0x050c5d1f, 0x2b24d044, 0x9d2c3f7f, 0x7729c516, 0xb91d6109, 0x931ae6a0, 0x052255db, 0xbef39fe6, 0x6150ac75, 0x9aab3a3d, 0x519c4c3e, 0x0c1c9eb8, 0x5f299f4e, 0xef8580f3, 0xac297727, 0x4546b9c0, 0xbd564e7d, 0x6bdd5c67, 0xdd77ed30, 0xf4ca9683, 0x4aeb9bd0, 0xe0e67ad0, 0xc2d32fa8, 0x7f743fb7, 0x6900631f, 0xc59c990e, 0x448524fd, 0xd49930d5, 0x1c85c7ca, 0x0229fe89, 0x2c469265, 0xce566940, 0x8bdd8ec7, 0x34787625, 0xd3ca6290, 0xddeaf039, 0xc0e64870, 0xdad35570, 0x5a740578, 0x5b004d15, 0x6a9c09cd, 0x2384f10a, 0xda993a47, 0x8227df4f, 0x4c298165, 0xfc563735, 0x8cb91483, 0x775bf5d0, 0xd5c428d0, 0x34cc0ea3, 0xea3b4cb7, 0x8e59f029, 0x2094de2b, 0xa65a0ad4, 0x9bbee5f4, 0xbe836343, 0x22d5344e, 0x19a1470c, 0x4a56b1ff, 0x70b8e86f, 0x0a5b4a39, 0xb5c3f670, 0x53cc3f70, 0xc03b0a99, 0x7259c415, 0x4095108b, 0x7559bdb1, 0xb3bf0bbc, 0x2183ff1c, 0x2bd54279, 0x23a156ca, 0x64e2d7e4, 0x683af69a, 0xaed2346e, 0x4f9f2cab, 0x02935131, 0xc48fb86d, 0x2269f369, 0xc18fb3b4, 0x50ef1236, 0xc28fb547, 0x96c3bf47, 0xbf8fb08e, 0xf3e4d49c, 0x32179058, 0x280bfee6, 0x30178d32, 0x21addaf8, 0x4217a988, 0x772633d6, 0x08a3d11e, 0xb7e2323a, 0x07a3cf8b, 0x91dfb7d1, 0x06a3cdf8, 0x6bdd3d68, 0x1d5636a7, 0xd5b808e5, 0x1353e852, 0xbf16b916, 0xa55b89ed, 0x3c1a2017, 0x0588b13c, 0xf22f0174, 0xe83641e1, 0x6e69b533, 0xf1760448, 0x64c8bd58, 0x97b4ea23, 0x9a4e92e6, 0xcfb14012, 0xf01b2511, 0x0bbb59c3, 0xce524afa, 0xdd16ef45, 0x60648bb3, 0x7fa4bcfc, 0x5053ae17, 0xc9302890, 0x956ded32, 0x9136db84, 0xdf9d3323, 0x32bb6cd0, 0xc8f8385b, 0xeb08bfba, 0x62cc8e3d, 0xc3e20f5c, 0x39e97f17, 0x7837b203, 0x319e877b, 0xd3e63f89, 0x29b50b38, 0x5ed678b8, 0xb0d5b793, 0x52450be5, 0xfa72d767, 0x95066709, 0x7f52e123, 0x76966481, 0x063258b0, 0x2ded6e8a, 0xb07d7c52, 0xd0c71b71, 0xf684f1bd, 0x868ecfa8, 0xf794f684, 0xd19701c3, 0x346e171e, 0x91f8f676, 0x0bf58848, 0x6317b6d1, 0xafad4c54, 0x0f25681e, 0x91b18d49, 0x7d61c12e, 0x5147d25c, 0x9a8b6805, 0x4cd2a447, 0x1e549b14, 0x2fe1b574, 0xcf0cd31e, 0x6c471669, 0x0e5eef1e, 0x2bed3602, 0xb26249e0, 0x2c9b86a4 },
    new ulong[] { 0xcbf29ce484222325, 0xaf63bd4c8601b7be, 0xaf63bd4c8601b7bd, 0xaf63bd4c8601b7bc, 0xaf63bd4c8601b7bb, 0xaf63bd4c8601b7ba, 0xaf63bd4c8601b7b9, 0x08326207b4eb2f34, 0xd8cbc7186ba13533, 0x0378817ee2ed65cb, 0xd329d59b9963f790, 0x340d8765a4dda9c2, 0xaf63bd4c8601b7df, 0x08326707b4eb37da, 0x08326607b4eb3627, 0x08326507b4eb3474, 0x08326407b4eb32c1, 0x08326307b4eb310e, 0x08326207b4eb2f5b, 0xd8cbc7186ba1355c, 0x0378817ee2ed65a9, 0xd329d59b9963f7f1, 0x340d8765a4dda9b0, 0x50a6d3b724a774a6, 0x08326507b4eb341c, 0xd8d5c8186ba98bfb, 0x1ccefc7ef118dbef, 0x0c92fab3ad3db77a, 0x9b77794f5fdec421, 0x0ac742dfe7874433, 0xd7dad5766ad8e2de, 0xa1bb96378e897f5b, 0x5b3f9b6733a367d2, 0xb07ce25cbea969f6, 0x8d9e9997f9df0d6a, 0x838c673d9603cb7b, 0x8b5ee8a5e872c273, 0x4507c4e9fb00690c, 0x4c9ca59581b27f45, 0xe0aca20b624e4235, 0xd8d5c8186ba98b94, 0x1ccefc7ef118db81, 0x0c92fab3ad3db71d, 0x9b77794f5fdec44e, 0x0ac742dfe7874413, 0xd7dad5766ad8e2a9, 0xa1bb96378e897f3a, 0x5b3f9b6733a367a1, 0xb07ce25cbea969d6, 0x8d9e9997f9df0d02, 0x838c673d9603cb1e, 0x8b5ee8a5e872c201, 0x4507c4e9fb006969, 0x4c9ca59581b27f64, 0xe0aca20b624e423f, 0x13998e580afa800f, 0x08326507b4eb3401, 0xd8d5ad186ba95dc1, 0x1c72e17ef0ca4e97, 0x2183c1b327c38ae6, 0xb66d096c914504f2, 0x404bf57ad8476757, 0x887976bd815498bb, 0x3afd7f02c2bf85a5, 0xfc4476b0eb70177f, 0x186d2da00f77ecba, 0xf97140fa48c74066, 0xa2b1cf49aa926d37, 0x0690712cd6cf940c, 0xf7045b3102b8906e, 0xd8d5ad186ba95db3, 0x1c72e17ef0ca4ef3, 0x2183c1b327c38a95, 0xb66d096c914504d2, 0x404bf57ad8476736, 0x887976bd815498d5, 0x3afd7f02c2bf85c1, 0xfc4476b0eb70175f, 0x186d2da00f77eccd, 0xf97140fa48c7400e, 0xa2b1cf49aa926d52, 0x0690712cd6cf9475, 0xf7045b3102b89064, 0x74f762479f9d6aea, 0x08326007b4eb2b9c, 0xd8c4c9186b9b1a14, 0x7b495389bdbdd4c7, 0x3b6dba0d69908e25, 0xd6b2b17bf4b71261, 0x447bfb7f98e615b5, 0xd6b2b17bf4b71262, 0x3bd2807f93fe1660, 0xd6b2b17bf4b71263, 0x3329057f8f16170b, 0xd6b2b17bf4b71264, 0x2a7f8a7f8a2e19b6, 0x23d3767e64b2f98a, 0xff768d7e4f9d86a4, 0x23d3767e64b2f984, 0xccd1837e334e4aa6, 0x23d3767e64b2f99a, 0x7691fd7e028f6754, 0x34ad3b1041204318, 0xa29e749ea9d201c8, 0x34ad3b104120431b, 0xa29e779ea9d206e1, 0x34ad3b104120431a, 0xa29e769ea9d2052e, 0x02a17ebca4aa3497, 0x229ef18bcd375c95, 0x02a17dbca4aa32c8, 0x229b6f8bcd3449d8, 0x02a184bca4aa3ed5, 0x22b3618bcd48c3ef, 0x5c2c346706186f36, 0xb78c410f5b84f8c2, 0xed9478212b267395, 0xd9bbb55c5256662f, 0x8c54f0203249438a, 0xbd9790b5727dc37e, 0xa64e5f36c9e2b0e3, 0x8fd0680da3088a04, 0x67aad32c078284cc, 0xb37d55d81c57b331, 0x55ac0f3829057c43, 0xcb27f4b8e1b6cc20, 0x26caf88bcbef2d19, 0x8e6e063b97e61b8f, 0xb42750f7f3b7c37e, 0xf3c6ba64cf7ca99b, 0xebfb69b427ea80fe, 0x39b50c3ed970f46c, 0x5b9b177aa3eb3e8a, 0x6510063ecf4ec903, 0x2b3bbd2c00797c7a, 0xf1d6204ff5cb4aa7, 0x4836e27ccf099f38, 0x82efbb0dd073b44d, 0x4a80c282ffd7d4c6, 0x305d1a9c9ee43bdf, 0x15c366948ffc6997, 0x80153ae218916e7b, 0xfa23e2bdf9e2a9e1, 0xd47e8d8a2333c6de, 0x7e128095f688b056, 0x2f5356890efcedab, 0x95c2b383014f55c5, 0x4727a5339ce6070f, 0xb0555ecd575108e9, 0x48d785770bb4af37, 0x09d4701c12af02b1, 0x79f031e78f3cf62e, 0x52a1ee85db1b5a94, 0x6bd95b2eb37fa6b8, 0x74971b7077aef85d, 0xb4e4fae2ffcc1aad, 0x2bd48bd898b8f63a, 0xe9966ac1556257f6, 0x92a3d1cd078ba293, 0xf81175a482e20ab8, 0x5bbb3de722e73048, 0x6b4f363492b9f2be, 0xc2d559df73d59875, 0xf75f62284bc7a8c2, 0xda8dd8e116a9f1cc, 0xbdc1e6ab76057885, 0xfec6a4238a1224a0, 0xc03f40f3223e290e, 0x1ed21673466ffda9, 0xdf70f906bb0dd2af, 0xf3dcda369f2af666, 0x9ebb11573cdcebde, 0x81c72d9077fedca0, 0x0ec074a31be5fb15, 0x2a8b3280b6c48f20, 0xfd31777513309344, 0x194534a86ad006b6, 0x3be6fdf46e0cfe12, 0x017cc137a07eb057, 0x9428fc6e7d26b54d, 0x9aaa2e3603ef8ad7, 0x82c6d3f3a0ccdf7d, 0xc86eeea00cf09b65, 0x705f8189dbb58299, 0x415a7f554391ca69, 0xcfe3d49fa2bdc555, 0xf0f9c56039b25191, 0x7075cb6abd1d32d9, 0x43c94e2c8b277509, 0x3cbfd4e4ea670359, 0xc05887810f4d019d, 0x14468ff93ac22dc5, 0xebed699589d99c05, 0x6d99f6df321ca5d5, 0x0cd410d08c36d625, 0xef1b2a2c86831d35, 0x3b349c4d69ee5f05, 0x55248ce88f45f035, 0xaa69ca6a18a4c885, 0x1fe3fce62bd816b5, 0x0289a488a8df69d9, 0x15e96e1613df98b5, 0xe6be57375ad89b99 },
    new ulong[] { 0xcbf29ce484222325, 0xaf63dc4c8601ec8c, 0xaf63df4c8601f1a5, 0xaf63de4c8601eff2, 0xaf63d94c8601e773, 0xaf63d84c8601e5c0, 0xaf63db4c8601ead9, 0x08985907b541d342, 0xdcb27518fed9d577, 0xdd120e790c2512af, 0xcac165afa2fef40a, 0x85944171f73967e8, 0xaf63bd4c8601b7df, 0x089be207b544f1e4, 0x08a61407b54d9b5f, 0x08a2ae07b54ab836, 0x0891b007b53c4869, 0x088e4a07b5396540, 0x08987c07b5420ebb, 0xdcb28a18fed9f926, 0xdd1270790c25b935, 0xcac146afa2febf5d, 0x8593d371f738acfe, 0x34531ca7168b8f38, 0x08a25607b54a22ae, 0xf5faf0190cf90df3, 0xf27397910b3221c7, 0x2c8c2b76062f22e0, 0xe150688c8217b8fd, 0xf35a83c10e4f1f87, 0xd1edd10b507344d0, 0x2a5ee739b3ddb8c3, 0xdcfb970ca1c0d310, 0x4054da76daa6da90, 0xf70a2ff589861368, 0x4c628b38aed25f17, 0x9dd1f6510f78189f, 0xa3de85bd491270ce, 0x858e2fa32a55e61d, 0x46810940eff5f915, 0xf5fadd190cf8edaa, 0xf273ed910b32b3e9, 0x2c8c5276062f6525, 0xe150b98c821842a0, 0xf35aa3c10e4f55e7, 0xd1ed680b50729265, 0x2a5f0639b3dded70, 0xdcfbaa0ca1c0f359, 0x4054ba76daa6a430, 0xf709c7f5898562b0, 0x4c62e638aed2f9b8, 0x9dd1a8510f779415, 0xa3de2abd4911d62d, 0x858e0ea32a55ae0a, 0x46810f40eff60347, 0xc33bce57bef63eaf, 0x08a24307b54a0265, 0xf5b9fd190cc18d15, 0x4c968290ace35703, 0x07174bd5c64d9350, 0x5a294c3ff5d18750, 0x05b3c1aeb308b843, 0xb92a48da37d0f477, 0x73cdddccd80ebc49, 0xd58c4c13210a266b, 0xe78b6081243ec194, 0xb096f77096a39f34, 0xb425c54ff807b6a3, 0x23e520e2751bb46e, 0x1a0b44ccfe1385ec, 0xf5ba4b190cc2119f, 0x4c962690ace2baaf, 0x0716ded5c64cda19, 0x5a292c3ff5d150f0, 0x05b3e0aeb308ecf0, 0xb92a5eda37d119d9, 0x73ce41ccd80f6635, 0xd58c2c132109f00b, 0xe78baf81243f47d1, 0xb0968f7096a2ee7c, 0xb425a84ff807855c, 0x23e4e9e2751b56f9, 0x1a0b4eccfe1396ea, 0x54abd453bb2c9004, 0x08ba5f07b55ec3da, 0x337354193006cb6e, 0xa430d84680aabd0b, 0xa9bc8acca21f39b1, 0x6961196491cc682d, 0xad2bb1774799dfe9, 0x6961166491cc6314, 0x8d1bb3904a3b1236, 0x6961176491cc64c7, 0xed205d87f40434c7, 0x6961146491cc5fae, 0xcd3baf5e44f8ad9c, 0xe3b36596127cd6d8, 0xf77f1072c8e8a646, 0xe3b36396127cd372, 0x6067dce9932ad458, 0xe3b37596127cf208, 0x4b7b10fa9fe83936, 0xaabafe7104d914be, 0xf4d3180b3cde3eda, 0xaabafd7104d9130b, 0xf4cfb20b3cdb5bb1, 0xaabafc7104d91158, 0xf4cc4c0b3cd87888, 0xe729bac5d2a8d3a7, 0x74bc0524f4dfa4c5, 0xe72630c5d2a5b352, 0x6b983224ef8fb456, 0xe73042c5d2ae266d, 0x8527e324fdeb4b37, 0x0a83c86fee952abc, 0x7318523267779d74, 0x3e66d3d56b8caca1, 0x956694a5c0095593, 0xcac54572bb1a6fc8, 0xa7a4c9f3edebf0d8, 0x7829851fac17b143, 0x2c8f4c9af81bcf06, 0xd34e31539740c732, 0x3605a2ac253d2db1, 0x08c11b8346f4a3c3, 0x6be396289ce8a6da, 0xd9b957fb7fe794c5, 0x05be33da04560a93, 0x0957f1577ba9747c, 0xda2cc3acc24fba57, 0x74136f185b29e7f0, 0xb2f2b4590edb93b2, 0xb3608fce8b86ae04, 0x4a3a865079359063, 0x5b3a7ef496880a50, 0x48fae3163854c23b, 0x07aaa640476e0b9a, 0x2f653656383a687d, 0xa1031f8e7599d79c, 0xa31908178ff92477, 0x097edf3c14c3fb83, 0xb51ca83feaa0971b, 0xdd3c0d96d784f2e9, 0x86cd26a9ea767d78, 0xe6b215ff54a30c18, 0xec5b06a1c5531093, 0x45665a929f9ec5e5, 0x8c7609b4a9f10907, 0x89aac3a491f0d729, 0x32ce6b26e0f4a403, 0x614ab44e02b53e01, 0xfa6472eb6eef3290, 0x9e5d75eb1948eb6a, 0xb6d12ad4a8671852, 0x88826f56eba07af1, 0x44535bf2645bc0fd, 0x169388ffc21e3728, 0xf68aac9e396d8224, 0x8e87d7e7472b3883, 0x295c26caa8b423de, 0x322c814292e72176, 0x8a06550eb8af7268, 0xef86d60e661bcf71, 0x9e5426c87f30ee54, 0xf1ea8aa826fd047e, 0x0babaf9a642cb769, 0x4b3341d4068d012e, 0xd15605cbc30a335c, 0x5b21060aed8412e5, 0x45e2cda1ce6f4227, 0x50ae3745033ad7d4, 0xaa4588ced46bf414, 0xc1b0056c4a95467e, 0x56576a71de8b4089, 0xbf20965fa6dc927e, 0x569f8383c2040882, 0xe1e772fba08feca0, 0x4ced94af97138ac4, 0xc4112ffb337a82fb, 0xd64a4fd41de38b7d, 0x4cfc32329edebcbb, 0x0803564445050395, 0xaa1574ecf4642ffd, 0x694bc4e54cc315f9, 0xa3d7cb273b011721, 0x577c2f8b6115bfa5, 0xb7ec8c1a769fb4c1, 0x5d5cfce63359ab19, 0x33b96c3cd65b5f71, 0xd845097780602bb9, 0x84d47645d02da3d5, 0x83544f33b58773a5, 0x9175cbb2160836c5, 0xc71b3bc175e72bc5, 0x636806ac222ec985, 0xb6ef0e6950f52ed5, 0xead3d8a0f3dfdaa5, 0x922908fe9a861ba5, 0x6d4821de275fd5c5, 0x1fe3fce62bd816b5, 0xc23e9fccd6f70591, 0xc1af12bdfe16b5b5, 0x39e9f18f2f85e221 }
    };

    var hashes = new HashAlgorithm[] { new FNV1Hash32(), new FNV1aHash32(), new FNV1Hash64(), new FNV1aHash64() };

    // Iterate all hashes
    for (int h = 0; h < hashes.Length; h++)
    {
    var hash = hashes[h];

    // Iterate all testvectors
    for (int i = 0; i < testvectors.Length; i++)
    {
    // We don't use Encoding.Ascii.GetBytes (or any other Encoding) because the original testvectors treat the text as raw bytes
    using (var s = new MemoryStream(testvectors[i].ToCharArray().Select(c => (byte)c).ToArray()))
    {
    // Compute hash & convert to ulong
    var value = hash.ComputeHash(s);
    var convertedvalue = hash.HashSize == 32 ? BitConverter.ToUInt32(value, 0) : BitConverter.ToUInt64(value, 0);

    // Compare computed hash against known check value
    if (convertedvalue != checkvalues[h][i])
    Console.WriteLine($"TEST FAILED for {hash.GetType().Name}, vector {i}: [{testvectors[i].Replace("\0", "\\0")}], expected: {checkvalues[h][i]}, actual: {value}");
    }
    }
    }
  3. RobThree created this gist Sep 14, 2017.
    110 changes: 110 additions & 0 deletions fnvhash.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,110 @@
    public abstract class FNVHash : HashAlgorithm
    {
    protected const uint FNV32_PRIME = 16777619;
    protected const uint FNV32_OFFSETBASIS = 2166136261;

    protected const ulong FNV64_PRIME = 1099511628211;
    protected const ulong FNV64_OFFSETBASIS = 14695981039346656037;

    public FNVHash(int hashSize)
    {
    this.HashSizeValue = hashSize;
    this.Initialize();
    }
    }

    public class FNV1Hash32 : FNVHash
    {
    private uint _hash;

    public FNV1Hash32()
    : base(32) { }

    public override void Initialize()
    {
    _hash = FNV32_OFFSETBASIS;
    }

    protected override void HashCore(byte[] array, int ibStart, int cbSize)
    {
    for (int i = 0; i < cbSize; i++)
    _hash = (_hash * FNV32_PRIME) ^ array[ibStart + i];
    }

    protected override byte[] HashFinal()
    {
    return BitConverter.GetBytes(_hash);
    }
    }

    public class FNV1Hash64 : FNVHash
    {
    private ulong _hash;

    public FNV1Hash64()
    : base(64) { }

    public override void Initialize()
    {
    _hash = FNV64_OFFSETBASIS;
    }

    protected override void HashCore(byte[] array, int ibStart, int cbSize)
    {
    for (int i = 0; i < cbSize; i++)
    _hash = (_hash * FNV64_PRIME) ^ array[ibStart + i];
    }

    protected override byte[] HashFinal()
    {
    return BitConverter.GetBytes(_hash);
    }
    }

    public class FNV1aHash32 : FNVHash
    {
    private uint _hash;

    public FNV1aHash32()
    : base(32) { }

    public override void Initialize()
    {
    _hash = FNV32_OFFSETBASIS;
    }

    protected override void HashCore(byte[] array, int ibStart, int cbSize)
    {
    for (int i = 0; i < cbSize; i++)
    _hash = (_hash ^ array[ibStart + i]) * FNV32_PRIME;
    }

    protected override byte[] HashFinal()
    {
    return BitConverter.GetBytes(_hash);
    }
    }

    public class FNV1aHash64 : FNVHash
    {
    private ulong _hash;

    public FNV1aHash64()
    : base(64) { }

    public override void Initialize()
    {
    _hash = FNV64_OFFSETBASIS;
    }

    protected override void HashCore(byte[] array, int ibStart, int cbSize)
    {
    for (int i = 0; i < cbSize; i++)
    _hash = (_hash ^ array[ibStart + i]) * FNV64_PRIME;
    }

    protected override byte[] HashFinal()
    {
    return BitConverter.GetBytes(_hash);
    }
    }