application/octet-stream
•
4.75 KB
•
74 lines
(def table (:u32 (buffer/allocate (* 256 4))))
(let ((v '( #x00000000, #xF26B8303, #xE13B70F7, #x1350F3F4, #xC79A971F, #x35F1141C,
#x26A1E7E8, #xD4CA64EB, #x8AD958CF, #x78B2DBCC, #x6BE22838, #x9989AB3B,
#x4D43CFD0, #xBF284CD3, #xAC78BF27, #x5E133C24, #x105EC76F, #xE235446C,
#xF165B798, #x030E349B, #xD7C45070, #x25AFD373, #x36FF2087, #xC494A384,
#x9A879FA0, #x68EC1CA3, #x7BBCEF57, #x89D76C54, #x5D1D08BF, #xAF768BBC,
#xBC267848, #x4E4DFB4B, #x20BD8EDE, #xD2D60DDD, #xC186FE29, #x33ED7D2A,
#xE72719C1, #x154C9AC2, #x061C6936, #xF477EA35, #xAA64D611, #x580F5512,
#x4B5FA6E6, #xB93425E5, #x6DFE410E, #x9F95C20D, #x8CC531F9, #x7EAEB2FA,
#x30E349B1, #xC288CAB2, #xD1D83946, #x23B3BA45, #xF779DEAE, #x05125DAD,
#x1642AE59, #xE4292D5A, #xBA3A117E, #x4851927D, #x5B016189, #xA96AE28A,
#x7DA08661, #x8FCB0562, #x9C9BF696, #x6EF07595, #x417B1DBC, #xB3109EBF,
#xA0406D4B, #x522BEE48, #x86E18AA3, #x748A09A0, #x67DAFA54, #x95B17957,
#xCBA24573, #x39C9C670, #x2A993584, #xD8F2B687, #x0C38D26C, #xFE53516F,
#xED03A29B, #x1F682198, #x5125DAD3, #xA34E59D0, #xB01EAA24, #x42752927,
#x96BF4DCC, #x64D4CECF, #x77843D3B, #x85EFBE38, #xDBFC821C, #x2997011F,
#x3AC7F2EB, #xC8AC71E8, #x1C661503, #xEE0D9600, #xFD5D65F4, #x0F36E6F7,
#x61C69362, #x93AD1061, #x80FDE395, #x72966096, #xA65C047D, #x5437877E,
#x4767748A, #xB50CF789, #xEB1FCBAD, #x197448AE, #x0A24BB5A, #xF84F3859,
#x2C855CB2, #xDEEEDFB1, #xCDBE2C45, #x3FD5AF46, #x7198540D, #x83F3D70E,
#x90A324FA, #x62C8A7F9, #xB602C312, #x44694011, #x5739B3E5, #xA55230E6,
#xFB410CC2, #x092A8FC1, #x1A7A7C35, #xE811FF36, #x3CDB9BDD, #xCEB018DE,
#xDDE0EB2A, #x2F8B6829, #x82F63B78, #x709DB87B, #x63CD4B8F, #x91A6C88C,
#x456CAC67, #xB7072F64, #xA457DC90, #x563C5F93, #x082F63B7, #xFA44E0B4,
#xE9141340, #x1B7F9043, #xCFB5F4A8, #x3DDE77AB, #x2E8E845F, #xDCE5075C,
#x92A8FC17, #x60C37F14, #x73938CE0, #x81F80FE3, #x55326B08, #xA759E80B,
#xB4091BFF, #x466298FC, #x1871A4D8, #xEA1A27DB, #xF94AD42F, #x0B21572C,
#xDFEB33C7, #x2D80B0C4, #x3ED04330, #xCCBBC033, #xA24BB5A6, #x502036A5,
#x4370C551, #xB11B4652, #x65D122B9, #x97BAA1BA, #x84EA524E, #x7681D14D,
#x2892ED69, #xDAF96E6A, #xC9A99D9E, #x3BC21E9D, #xEF087A76, #x1D63F975,
#x0E330A81, #xFC588982, #xB21572C9, #x407EF1CA, #x532E023E, #xA145813D,
#x758FE5D6, #x87E466D5, #x94B49521, #x66DF1622, #x38CC2A06, #xCAA7A905,
#xD9F75AF1, #x2B9CD9F2, #xFF56BD19, #x0D3D3E1A, #x1E6DCDEE, #xEC064EED,
#xC38D26C4, #x31E6A5C7, #x22B65633, #xD0DDD530, #x0417B1DB, #xF67C32D8,
#xE52CC12C, #x1747422F, #x49547E0B, #xBB3FFD08, #xA86F0EFC, #x5A048DFF,
#x8ECEE914, #x7CA56A17, #x6FF599E3, #x9D9E1AE0, #xD3D3E1AB, #x21B862A8,
#x32E8915C, #xC083125F, #x144976B4, #xE622F5B7, #xF5720643, #x07198540,
#x590AB964, #xAB613A67, #xB831C993, #x4A5A4A90, #x9E902E7B, #x6CFBAD78,
#x7FAB5E8C, #x8DC0DD8F, #xE330A81A, #x115B2B19, #x020BD8ED, #xF0605BEE,
#x24AA3F05, #xD6C1BC06, #xC5914FF2, #x37FACCF1, #x69E9F0D5, #x9B8273D6,
#x88D28022, #x7AB90321, #xAE7367CA, #x5C18E4C9, #x4F48173D, #xBD23943E,
#xF36E6F75, #x0105EC76, #x12551F82, #xE03E9C81, #x34F4F86A, #xC69F7B69,
#xD5CF889D, #x27A40B9E, #x79B737BA, #x8BDCB4B9, #x988C474D, #x6AE7C44E,
#xBE2DA0A5, #x4C4623A6, #x5F16D052, #xAD7D5351)))
(dotimes (i 256)
(set! table i (car v))
(cdr! v)))
(defn hash (data)
:export
(def crc #xFFFFFFFF)
(when (and (not= (:type-name data) :buffer)
(not= (:type-name data) :string))
(exception :type-error "Can only hash buffers or strings"))
(dotimes (i (:length data) (bit-xor #xFFFFFFFF crc))
(set! crc (bit-and #xFFFFFFFF
(bit-xor (bit-shift-right crc 8)
(ref table (bit-and #xFF (bit-xor crc (ref data i)))))))))
(deftest "C1D04330" (fmt "{:08X}" (crypto/crc32c/hash "a")))
(deftest "5185664B" (fmt "{:08X}" (crypto/crc32c/hash "Test")))
(deftest "4D551068" (fmt "{:08X}" (crypto/crc32c/hash "Hello, World!")))
(defn main (args)
:export
(when (not (car args))
(efmtln "Usage: (...FILES)")
(exit 1))
(doseq (file args)
(if (file/dir? file)
(pfmtln "nujel/crc32: {file}: Is a directory")
(if (file/file? file)
(pfmtln "{:08X} {file} CRC32" (hash (slurp/buffer file)))
(pfmtln "nujel/crc32: {file}: No such file or directory")))))