@takker/crc
CRC-32 algorithmなどの各種巡回冗長検査のDeno/Browser向けコードを入れたjsr package
https://jsr.io/@takker/crc
https://github.com/takker99/crc
motivation
すでにCRC32を計算するpackagesはあるが、bundle sizeが大きすぎるか余り使われていない
npm
SheetJS/js-crc32
一番使われている
classで実装しているため、余計なコードを削除できない
2.1kB程度
alexgorbatchev/crc
https://github.com/alexgorbatchev/crc/
crc/calcualtors/crc32が2.9kB
cache tableをhard codingしているため、どうしても1kBを越えてしまう
jsr
なし
deno.land/x
https://deno.land/x/crc32@v0.2.2
class実装、冗長
https://deno.land/x/crc32hash@v1.0.0
古いinterfaceであるDeno.Readerを使う形式
Denoにvendor-lockinされている
https://deno.land/x/buffer_crc32@v1.0.0
Bufferを使う形式
web APIに沿っていない
fflateの実装を参考に書いたコードは263B (0.3kB)に収まったので、これをpackageとしてpublishして使おうと思った
ついでにAdler-32などの他の巡回冗長検査アルゴリズムの実装も入れようと思ったので、package nameはCRCとした
alexgorbatchev/crcを真似ている
まって、Adler-32はCRCとは関係ないか
ということは、package nameは@takker/crcではなく@takker/checksumのほうがいいか?
いや、@takker/md5を作ってしまったし、Adler-32は@takker/adler32として別のrepoにしたほうがいいか?
うーんめんどい、やっぱり同じrepoにするか?
でも検索する側からしたら、別のpackageになっていたほうが検索しやすいか
JSRはpackage nameからしか検索できないみたい
Adler-32はadlerで、別のrepoで作ろう
API design
crc32(data: Uint8Array, prev?: number): number
dataをchunksで与えて逐次計算したいときは、prevに前回計算したchecksumを渡す
Incrementally calculate a CRCと説明すればいいかなhttps://github.com/alexgorbatchev/crc?tab=readme-ov-file#usage
❌️JSで実装する
jsr.ioのコードをweb browserからdirectにimportできたら便利かと思ったが、現状だとJavaScript+JSDocではslow-type判定されていしまう
いちいち.d.tsを用意するのは面倒
幸い、esm.shがJSRに対応しているので、そちらから読み込めば事が済む
例:https://esm.sh/jsr/@core/unknownutil@4.2.2/is
実装
ほぼfflateの実装と同じ
一部型定義を通すために書き換えた
cache tableはhard codingせず、program起動時に計算させる
base64で圧縮しても1.3kB程度までしか小さくならない
unit tests
https://github.com/alexgorbatchev/crc/blob/master/tests/test_helpers.ts
https://github.com/SheetJS/js-crc32/blob/master/ctest/crc32.js
#2024-08-23 07:41:14