pub const WORD_SIZE: usize = 8;
pub const BASE_SAMPLE_RATE: usize = 3;
pub const GEAR_MX: [u64; 256] = [
0xb088_d3a9_e840_f559,
0x5652_c7f7_39ed_20d6,
0x45b2_8969_8989_72ab,
0x6b0a_89d5_b68e_c777,
0x368f_573e_8b7a_31b7,
0x1dc6_36dc_e936_d94b,
0x207a_4c4e_5554_d5b6,
0xa474_b346_2823_9acb,
0x3b06_a83e_1ca3_b912,
0x90e7_8d6c_2f02_baf7,
0xe1c9_2df7_150d_9a8a,
0x8e95_053a_1086_d3ad,
0x5a2e_f4f1_b83a_0722,
0xa50f_ac94_9f80_7fae,
0x0e73_03eb_80d8_d681,
0x99b0_7edc_1570_ad0f,
0x689d_2fb5_55fd_3076,
0x0000_5082_119e_a468,
0xc4b0_8306_a88f_cc28,
0x3eb0_678a_f637_4afd,
0xf19f_87ab_86ad_7436,
0xf212_9fbf_be6b_c736,
0x4811_4957_5c98_a4ed,
0x0000_0106_9547_7bc5,
0x1fba_3780_1a9c_eacc,
0x3bf0_6fd6_63a4_9b6d,
0x9968_7e97_82e3_874b,
0x79a1_0673_aa50_d8e3,
0xe4ac_cf9e_6211_f420,
0x2520_e71f_8757_9071,
0x2bd5_d3fd_781a_8a9b,
0x00de_4dcd_dd11_c873,
0xeaa9_311c_5a87_392f,
0xdb74_8eb6_17bc_40ff,
0xaf57_9a8d_f620_bf6f,
0x86a6_e5da_1b09_c2b1,
0xcc2f_c30a_c322_a12e,
0x355e_2afe_c1f7_4267,
0x2d99_c8f4_c021_a47b,
0xbade_4b4a_9404_cfc3,
0xf7b5_1872_1d70_7d69,
0x3286_b658_7bf3_2c20,
0x0000_b688_86af_270c,
0xa115_d6e4_db8a_9079,
0x484f_7e9c_97b2_e199,
0xccca_7bb7_5713_e301,
0xbf25_84a6_2bb0_f160,
0xade7_e813_625d_bcc8,
0x0000_7094_0d87_955a,
0x8ae6_9108_139e_626f,
0xbd77_6ad7_2fde_38a2,
0xfb6b_001f_c2fc_c0cf,
0xc7a4_74b8_e67b_c427,
0xbaf6_f116_10eb_5d58,
0x09cb_1f5b_6de7_70d1,
0xb0b2_19e6_977d_4c47,
0x00cc_bc38_6ea7_ad4a,
0xcc84_9d0a_df97_3f01,
0x73a3_ef7d_016a_f770,
0xc807_d2d3_86bd_bdfe,
0x7f2a_c996_6c79_1730,
0xd037_a86b_c6c5_04da,
0xf3f1_7c66_1eaa_609d,
0xaca6_26b0_4daa_e687,
0x755a_9937_4f4a_5b07,
0x9083_7ee6_5b2c_aede,
0x6ee8_ad93_fd56_0785,
0x0000_d9e1_1053_edd8,
0x9e06_3bb2_d21c_dbd7,
0x07ab_77f1_2a01_d2b2,
0xec55_0255_e664_1b44,
0x78fb_94a8_449c_14c6,
0xc751_0e1b_c6c0_f5f5,
0x0000_320b_36e4_cae3,
0x827c_3326_2c8b_1a2d,
0x1467_5f0b_48ea_4144,
0x267b_d3a6_498d_eceb,
0xf191_6ff9_82f5_035e,
0x8622_1b7f_f434_fb88,
0x9dbe_cee7_386f_49d8,
0xea58_f8ca_c80f_8f4a,
0x008d_1986_92fc_64d8,
0x6d38_704f_babf_9a36,
0xe032_cb07_d1e7_be4c,
0x228d_21f6_ad45_0890,
0x635c_b1bf_c025_89a5,
0x4620_a173_9ca2_ce71,
0xa7e7_dfe3_aae5_fb58,
0x0c10_ca93_2b3c_0deb,
0x2727_fee8_84af_ed7b,
0xa2df_1c6d_f9e2_ab1f,
0x4dcd_d1ac_0774_f523,
0x0000_70ff_ad33_e24e,
0xa2ac_e87b_c597_7816,
0x9892_275a_b428_6049,
0xc286_1181_ddf1_8959,
0xbb99_72a0_4248_3e19,
0xef70_cd37_6651_3078,
0x0000_0513_abfc_9864,
0xc058_b618_58c9_4083,
0x09e8_5085_9725_e0de,
0x9197_fb3b_f83e_7d94,
0x7e1e_626d_12b6_4bce,
0x520c_5450_7f7b_57d1,
0xbee1_7971_74e2_2416,
0x6fd9_ac32_22e9_5587,
0x0023_957c_9adf_bf3e,
0xa01c_7d7e_234b_be15,
0xaba2_c758_b8a3_8cbb,
0x0d1f_a0ce_ec3e_2b30,
0x0bb6_a58b_7e60_b991,
0x4333_dd5b_9fa2_6635,
0xc2fd_3b7d_4001_c1a3,
0xfb41_8024_5473_1127,
0x65a5_6185_a50d_18cb,
0xf67a_02bd_8784_b54f,
0x696f_11dd_67e6_5063,
0x0000_2022_fca8_14ab,
0x8cd6_be91_2db9_d852,
0x6951_89b6_e9ae_8a57,
0xee94_53b5_0ada_0c28,
0xd8fc_5ea9_1a78_845e,
0xab86_bf19_1a4a_a767,
0x0000_c6b5_c864_15e5,
0x2673_1017_8e08_a22e,
0xed2d_101b_078b_ca25,
0x3b41_ed84_b226_a8fb,
0x13e6_2212_0f28_dc06,
0xa315_f5eb_fb70_6d26,
0x8816_c34e_3301_bace,
0xe939_5b9c_bb71_fdae,
0x002c_e920_2e72_1648,
0x4283_db1d_2bb3_c91c,
0xd77d_461a_d2b1_a6a5,
0xe2ec_17e4_6eeb_866b,
0xb8e0_be40_39fb_c47c,
0xdea1_60c4_d529_9d04,
0x7eec_86c8_d28c_3634,
0x2119_ad12_9f98_a399,
0xa6cc_f46b_61a2_83ef,
0x2c52_cede_f658_c617,
0x2db4_8711_69ac_dd83,
0x0000_f0d6_f39e_cbe9,
0x3dd5_d8c9_8d2f_9489,
0x8a18_72a2_2b01_f584,
0xf282_a4c4_0e7b_3cf2,
0x8020_ec2c_cb1b_a196,
0x6693_b6e0_9e59_e313,
0x0000_ce19_cc7c_83eb,
0x20cb_5735_f647_9c3b,
0x762e_bf37_59d7_5a5b,
0x207b_fe82_3d69_3975,
0xd77d_c112_339c_d9d5,
0x9ba7_8342_8462_7d03,
0x217d_c513_e95f_51e9,
0xb27b_1a29_fc5e_7816,
0x00d5_cd98_31bb_662d,
0x71e3_9b80_6d75_734c,
0x7e57_2af0_06fb_1a23,
0xa273_4f2f_6ae9_1f85,
0xbf82_c6b5_022c_ddf2,
0x5c3b_eac6_0761_a0de,
0xcdc8_93bb_4741_6998,
0x6d10_8561_5c18_7e01,
0x77f8_ae30_ac27_7c5d,
0x917c_6b81_122a_2c91,
0x5b75_b699_add1_6967,
0x0000_cf6a_e79a_069b,
0xf3c4_0afa_60de_1104,
0x2063_127a_a591_67c3,
0x621d_e622_69d1_894d,
0xd188_ac1d_e62b_4726,
0x1070_36e2_154b_673c,
0x0000_b85f_2855_3a1d,
0xf2ef_4e4c_1823_6f3d,
0xd9d6_de66_11b9_f602,
0xa1fc_7955_fb47_911c,
0xeb85_fd03_2f29_8dbd,
0xbe27_502f_b3be_fae1,
0xe303_4251_c4cd_661e,
0x4413_64d3_5407_1836,
0x0082_b36c_75f2_983e,
0xb145_9103_16fa_66f0,
0x021c_069c_9847_caf7,
0x2910_dfc7_5a4b_5221,
0x735b_353e_1c57_a8b5,
0xce44_312c_e98e_d96c,
0xbc94_2e45_06bd_fa65,
0xf050_86a7_1257_941b,
0xfec3_b215_d351_cead,
0x00ae_1055_e014_4202,
0xf54b_4084_6f42_e454,
0x0000_7fd9_c8bc_bcc8,
0xbfbd_9ef3_17de_9bfe,
0xa804_302f_f285_4e12,
0x39ce_4957_a5e5_d8d4,
0xffb9_e2a4_5637_ba84,
0x55b9_ad1d_9ea0_818b,
0x0000_8acb_f319_178a,
0x48e2_bfc8_d0fb_fb38,
0x8be3_9841_e848_b5e8,
0x0e27_1216_0696_a08b,
0xd510_96e8_4b44_242a,
0x1101_ba17_6792_e13a,
0xc22e_770f_4531_689d,
0x1689_eff2_72bb_c56c,
0x00a9_2a19_7f56_50ec,
0xbc76_5990_bda1_784e,
0xc614_41e3_92fc_b8ae,
0x07e1_3a2c_ed31_e4a0,
0x92cb_e984_234e_9d4d,
0x8f4f_f572_bb7d_8ac5,
0x0b96_70c0_0b96_3bd0,
0x6295_5a58_1a03_eb01,
0x645f_83e5_ea00_0254,
0x41fc_e516_cd88_f299,
0xbbda_9748_da7a_98cf,
0x0000_aab2_fe48_45fa,
0x1976_1b06_9bf5_6555,
0x8b8f_5e83_43b6_ad56,
0x3e5d_1cfd_1448_21d9,
0xec5c_1e2c_a2b0_cd8f,
0xfaf7_e0fe_a7fb_b57f,
0x0000_00d3_ba12_961b,
0xda3f_9017_8401_b18e,
0x70ff_906d_e33a_5feb,
0x0527_d5a7_c069_70e7,
0x22d8_e773_607c_13e9,
0xc9ab_70df_643c_3bac,
0xeda4_c6dc_8abe_12e3,
0xecef_1f41_0033_e78a,
0x0024_c2b2_74ac_72cb,
0x0674_0d95_4fa9_00b4,
0x1d7a_299b_323d_6304,
0xb3c3_7cb2_98cb_ead5,
0xc986_e3c7_6178_739b,
0x9fab_ea36_4b46_f58a,
0x6da2_14c5_af85_cc56,
0x17a4_3ed8_b7a3_8f84,
0x6ecc_ec51_1d9a_dbeb,
0xf9ca_b309_1333_5afb,
0x4a5e_60c5_f415_eed2,
0x0000_6967_5036_72b4,
0x9da5_1d12_1454_bb87,
0x8432_1e13_b9bb_c816,
0xfb3d_6fb6_ab2f_dd8d,
0x6030_5eed_8e16_0a8d,
0xcbbf_4b14_e994_6ce8,
0x0000_4f63_381b_10c3,
0x07d5_b781_6fcc_4e10,
0xe5a5_3672_6a6a_8155,
0x57af_b234_47a0_7fdd,
0x18f3_46f7_abc9_d394,
0x636d_c655_d61a_d33d,
0xcc8b_ab49_39f7_f3f6,
0x63c7_a906_c1dd_187b,
];
#[allow(dead_code)]
pub const GEAR_MX_L: [u64; 256] = [
0x6111_a753_d081_eab2,
0xaca5_8fee_73da_41ac,
0x8b65_12d3_1312_e556,
0xd615_13ab_6d1d_8eee,
0x6d1e_ae7d_16f4_636e,
0x3b8c_6db9_d26d_b296,
0x40f4_989c_aaa9_ab6c,
0x48e9_668c_5047_3596,
0x760d_507c_3947_7224,
0x21cf_1ad8_5e05_75ee,
0xc392_5bee_2a1b_3514,
0x1d2a_0a74_210d_a75a,
0xb45d_e9e3_7074_0e44,
0x4a1f_5929_3f00_ff5c,
0x1ce6_07d7_01b1_ad02,
0x3360_fdb8_2ae1_5a1e,
0xd13a_5f6a_abfa_60ec,
0xa104_233d_48d0,
0x8961_060d_511f_9850,
0x7d60_cf15_ec6e_95fa,
0xe33f_0f57_0d5a_e86c,
0xe425_3f7f_7cd7_8e6c,
0x9022_92ae_b931_49da,
0x020d_2a8e_f78a,
0x3f74_6f00_3539_d598,
0x77e0_dfac_c749_36da,
0x32d0_fd2f_05c7_0e96,
0xf342_0ce7_54a1_b1c6,
0xc959_9f3c_c423_e840,
0x4a41_ce3f_0eaf_20e2,
0x57ab_a7fa_f035_1536,
0x01bc_9b9b_ba23_90e6,
0xd552_6238_b50e_725e,
0xb6e9_1d6c_2f78_81fe,
0x5eaf_351b_ec41_7ede,
0x0d4d_cbb4_3613_8562,
0x985f_8615_8645_425c,
0x6abc_55fd_83ee_84ce,
0x5b33_91e9_8043_48f6,
0x75bc_9695_2809_9f86,
0xef6a_30e4_3ae0_fad2,
0x650d_6cb0_f7e6_5840,
0x0001_6d11_0d5e_4e18,
0x422b_adc9_b715_20f2,
0x909e_fd39_2f65_c332,
0x9994_f76e_ae27_c602,
0x7e4b_094c_5761_e2c0,
0x5bcf_d026_c4bb_7990,
0xe128_1b0f_2ab4,
0x15cd_2210_273c_c4de,
0x7aee_d5ae_5fbc_7144,
0xf6d6_003f_85f9_819e,
0x8f48_e971_ccf7_884e,
0x75ed_e22c_21d6_bab0,
0x1396_3eb6_dbce_e1a2,
0x6164_33cd_2efa_988e,
0x0199_7870_dd4f_5a94,
0x9909_3a15_bf2e_7e02,
0xe747_defa_02d5_eee0,
0x900f_a5a7_0d7b_7bfc,
0xfe55_932c_d8f2_2e60,
0xa06f_50d7_8d8a_09b4,
0xe7e2_f8cc_3d54_c13a,
0x594c_4d60_9b55_cd0e,
0xeab5_326e_9e94_b60e,
0x2106_fdcc_b659_5dbc,
0xddd1_5b27_faac_0f0a,
0x0001_b3c2_20a7_dbb0,
0x3c0c_7765_a439_b7ae,
0x0f56_efe2_5403_a564,
0xd8aa_04ab_ccc8_3688,
0xf1f7_2950_8938_298c,
0x8ea2_1c37_8d81_ebea,
0x6416_6dc9_95c6,
0x04f8_664c_5916_345a,
0x28ce_be16_91d4_8288,
0x4cf7_a74c_931b_d9d6,
0xe322_dff3_05ea_06bc,
0x0c44_36ff_e869_f710,
0x3b7d_9dce_70de_93b0,
0xd4b1_f195_901f_1e94,
0x011a_330d_25f8_c9b0,
0xda70_e09f_757f_346c,
0xc065_960f_a3cf_7c98,
0x451a_43ed_5a8a_1120,
0xc6b9_637f_804b_134a,
0x8c41_42e7_3945_9ce2,
0x4fcf_bfc7_55cb_f6b0,
0x1821_9526_5678_1bd6,
0x4e4f_fdd1_095f_daf6,
0x45be_38db_f3c5_563e,
0x9b9b_a358_0ee9_ea46,
0xe1ff_5a67_c49c,
0x4559_d0f7_8b2e_f02c,
0x3124_4eb5_6850_c092,
0x850c_2303_bbe3_12b2,
0x7732_e540_8490_7c32,
0xdee1_9a6e_cca2_60f0,
0x0a27_57f9_30c8,
0x80b1_6c30_b192_8106,
0x13d0_a10b_2e4b_c1bc,
0x232f_f677_f07c_fb28,
0xfc3c_c4da_256c_979c,
0xa418_a8a0_fef6_afa2,
0x7dc2_f2e2_e9c4_482c,
0xdfb3_5864_45d2_ab0e,
0x0047_2af9_35bf_7e7c,
0x4038_fafc_4697_7c2a,
0x5745_8eb1_7147_1976,
0x1a3f_419d_d87c_5660,
0x176d_4b16_fcc1_7322,
0x8667_bab7_3f44_cc6a,
0x85fa_76fa_8003_8346,
0xf683_0048_a8e6_224e,
0xcb4a_c30b_4a1a_3196,
0xecf4_057b_0f09_6a9e,
0xd2de_23ba_cfcc_a0c6,
0x4045_f950_2956,
0x19ad_7d22_5b73_b0a4,
0xd2a3_136d_d35d_14ae,
0xdd28_a76a_15b4_1850,
0xb1f8_bd52_34f1_08bc,
0x570d_7e32_3495_4ece,
0x0001_8d6b_90c8_2bca,
0x4ce6_202f_1c11_445c,
0xda5a_2036_0f17_944a,
0x7683_db09_644d_51f6,
0x27cc_4424_1e51_b80c,
0x462b_ebd7_f6e0_da4c,
0x102d_869c_6603_759c,
0xd272_b739_76e3_fb5c,
0x0059_d240_5ce4_2c90,
0x8507_b63a_5767_9238,
0xaefa_8c35_a563_4d4a,
0xc5d8_2fc8_ddd7_0cd6,
0x71c1_7c80_73f7_88f8,
0xbd42_c189_aa53_3a08,
0xfdd9_0d91_a518_6c68,
0x4233_5a25_3f31_4732,
0x4d99_e8d6_c345_07de,
0x58a5_9dbd_ecb1_8c2e,
0x5b69_0e22_d359_bb06,
0x0001_e1ad_e73d_97d2,
0x7bab_b193_1a5f_2912,
0x1430_e544_5603_eb08,
0xe505_4988_1cf6_79e4,
0x0041_d859_9637_432c,
0xcd27_6dc1_3cb3_c626,
0x0001_9c33_98f9_07d6,
0x4196_ae6b_ec8f_3876,
0xec5d_7e6e_b3ae_b4b6,
0x40f7_fd04_7ad2_72ea,
0xaefb_8224_6739_b3aa,
0x374f_0685_08c4_fa06,
0x42fb_8a27_d2be_a3d2,
0x64f6_3453_f8bc_f02c,
0x01ab_9b30_6376_cc5a,
0xe3c7_3700_daea_e698,
0xfcae_55e0_0df6_3446,
0x44e6_9e5e_d5d2_3f0a,
0x7f05_8d6a_0459_bbe4,
0xb877_d58c_0ec3_41bc,
0x9b91_2776_8e82_d330,
0xda21_0ac2_b830_fc02,
0xeff1_5c61_584e_f8ba,
0x22f8_d702_2454_5922,
0xb6eb_6d33_5ba2_d2ce,
0x0001_9ed5_cf34_0d36,
0xe788_15f4_c1bc_2208,
0x40c6_24f5_4b22_cf86,
0xc43b_cc44_d3a3_129a,
0xa311_583b_cc56_8e4c,
0x20e0_6dc4_2a96_ce78,
0x0001_70be_50aa_743a,
0xe5de_9c98_3046_de7a,
0xb3ad_bccc_2373_ec04,
0x43f8_f2ab_f68f_2238,
0xd70b_fa06_5e53_1b7a,
0x7c4e_a05f_677d_f5c2,
0xc606_84a3_899a_cc3c,
0x8826_c9a6_a80e_306c,
0x0105_66d8_ebe5_307c,
0x628b_2206_2df4_cde0,
0x0438_0d39_308f_95ee,
0x5221_bf8e_b496_a442,
0xe6b6_6a7c_38af_516a,
0x9c88_6259_d31d_b2d8,
0x7928_5c8a_0d7b_f4ca,
0xe0a1_0d4e_24af_2836,
0xfd87_642b_a6a3_9d5a,
0x015c_20ab_c028_8404,
0xea96_8108_de85_c8a8,
0xffb3_9179_7990,
0x7f7b_3de6_2fbd_37fc,
0x5008_605f_e50a_9c24,
0x739c_92af_4bcb_b1a8,
0xff73_c548_ac6f_7508,
0xab73_5a3b_3d41_0316,
0x0001_1597_e632_2f14,
0x91c5_7f91_a1f7_f670,
0x17c7_3083_d091_6bd0,
0x1c4e_242c_0d2d_4116,
0xaa21_2dd0_9688_4854,
0x2203_742e_cf25_c274,
0x845c_ee1e_8a62_d13a,
0x2d13_dfe4_e577_8ad8,
0x0152_5432_feac_a1d8,
0x78ec_b321_7b42_f09c,
0x8c28_83c7_25f9_715c,
0x0fc2_7459_da63_c940,
0x2597_d308_469d_3a9a,
0x1e9f_eae5_76fb_158a,
0x172c_e180_172c_77a0,
0xc52a_b4b0_3407_d602,
0xc8bf_07cb_d400_04a8,
0x83f9_ca2d_9b11_e532,
0x77b5_2e91_b4f5_319e,
0x0001_5565_fc90_8bf4,
0x32ec_360d_37ea_caaa,
0x171e_bd06_876d_5aac,
0x7cba_39fa_2890_43b2,
0xd8b8_3c59_4561_9b1e,
0xf5ef_c1fd_4ff7_6afe,
0x01a7_7425_2c36,
0xb47f_202f_0803_631c,
0xe1ff_20db_c674_bfd6,
0x0a4f_ab4f_80d2_e1ce,
0x45b1_cee6_c0f8_27d2,
0x9356_e1be_c878_7758,
0xdb49_8db9_157c_25c6,
0xd9de_3e82_0067_cf14,
0x0049_8564_e958_e596,
0x0ce8_1b2a_9f52_0168,
0x3af4_5336_647a_c608,
0x6786_f965_3197_d5aa,
0x930d_c78e_c2f0_e736,
0x3f57_d46c_968d_eb14,
0xdb44_298b_5f0b_98ac,
0x2f48_7db1_6f47_1f08,
0xdd99_d8a2_3b35_b7d6,
0xf395_6612_2666_b5f6,
0x94bc_c18b_e82b_dda4,
0xd2ce_a06c_e568,
0x3b4a_3a24_28a9_770e,
0x0864_3c27_7377_902c,
0xf67a_df6d_565f_bb1a,
0xc060_bddb_1c2c_151a,
0x977e_9629_d328_d9d0,
0x9ec6_7036_2186,
0x0fab_6f02_df98_9c20,
0xcb4a_6ce4_d4d5_02aa,
0xaf5f_6468_8f40_ffba,
0x31e6_8def_5793_a728,
0xc6db_8cab_ac35_a67a,
0x9917_5692_73ef_e7ec,
0xc78f_520d_83ba_30f6,
];
#[allow(clippy::cast_possible_truncation)]
#[allow(clippy::cast_lossless)]
pub fn build_hash_table(base_data: &[u8], start: usize, end: usize, hash_bits: u32) -> Vec<u32> {
let hash_size = 1usize << hash_bits;
let mut hash_table = vec![0u32; hash_size];
if end - start < WORD_SIZE {
return hash_table;
}
let shift_bits = (64 / WORD_SIZE) + (64 % WORD_SIZE != 0) as usize;
let index_shift = 64 - hash_bits;
let mut fingerprint = 0u64;
for i in 0..WORD_SIZE {
if start + i < end {
fingerprint = fingerprint
.wrapping_shl(shift_bits as u32)
.wrapping_add(GEAR_MX[base_data[start + i] as usize]);
}
}
let mut pos = start;
let num_chunks = end - start - WORD_SIZE;
while pos < start + num_chunks {
let index = (fingerprint >> index_shift) as usize;
hash_table[index] = pos as u32;
for _ in 0..BASE_SAMPLE_RATE {
if pos + WORD_SIZE < end {
fingerprint = fingerprint
.wrapping_shl(shift_bits as u32)
.wrapping_add(GEAR_MX[base_data[pos + WORD_SIZE] as usize]);
pos += 1;
} else {
break;
}
}
}
hash_table
}
#[inline]
#[allow(clippy::cast_possible_truncation)]
#[allow(clippy::cast_lossless)]
pub fn compute_fingerprint(data: &[u8], start: usize) -> u64 {
let shift_bits = (64 / WORD_SIZE) + (64 % WORD_SIZE != 0) as usize;
let mut fingerprint = 0u64;
for i in 0..WORD_SIZE {
if start + i < data.len() {
fingerprint = fingerprint
.wrapping_shl(shift_bits as u32)
.wrapping_add(GEAR_MX[data[start + i] as usize]);
}
}
fingerprint
}
#[inline]
#[allow(clippy::cast_possible_truncation)]
#[allow(clippy::cast_lossless)]
pub fn roll_fingerprint(fingerprint: u64, new_byte: u8) -> u64 {
let shift_bits = (64 / WORD_SIZE) + (64 % WORD_SIZE != 0) as usize;
fingerprint
.wrapping_shl(shift_bits as u32)
.wrapping_add(GEAR_MX[new_byte as usize])
}