]> git.rkrishnan.org Git - hs-rsync.git/commitdiff
add rolling checksum implementation
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Thu, 31 Dec 2015 13:28:53 +0000 (18:58 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Thu, 31 Dec 2015 13:28:53 +0000 (18:58 +0530)
src/Lib.hs

index 260de94db10ca1868214d51228d3fe462d82318c..2500097c022592c51fa9e189ac686c294dd32bde 100644 (file)
@@ -83,3 +83,10 @@ recreate f0 blockSize ins =
             RBlk i  -> (f0blocks !! i) `mappend` go f0blocks insts
             RChar w -> BL.singleton w `mappend` go f0blocks insts
 
+rollingChecksum :: Int -> Int -> BL.ByteString -> Word32
+rollingChecksum strtIdx lenBS bs = a `mod` m + ((fromIntegral b) `mod` m) * m
+  where a    = BL.foldl (\acc x -> acc + (fromIntegral x)) 0 bs'
+        b    = BL.foldl (\acc x -> acc + x) 0 (BL.pack wbs')
+        bs'  = BL.take (fromIntegral lenBS) $ BL.drop (fromIntegral strtIdx) bs
+        m    = 2^16
+        wbs' = BL.zipWith (*) (BL.pack (reverse (map fromIntegral [1..(lenBS - strtIdx + 1)]))) bs'