+140
| # adler32 | ||
| Signed ADLER-32 algorithm implementation in JS (for the browser and nodejs). | ||
| Emphasis on correctness, performance, and IE6+ support. | ||
| ## Installation | ||
| With [npm](https://www.npmjs.org/package/adler-32): | ||
| ```bash | ||
| $ npm install adler-32 | ||
| ``` | ||
| In the browser: | ||
| ```html | ||
| <script lang="javascript" src="adler32.js"></script> | ||
| ``` | ||
| The browser exposes a variable `ADLER32`. | ||
| When installed globally, npm installs a script `adler32` that computes the | ||
| checksum for a specified file or standard input. | ||
| The script will manipulate `module.exports` if available (e.g. in a CommonJS | ||
| `require` context). This is not always desirable. To prevent the behavior, | ||
| define `DO_NOT_EXPORT_ADLER`. | ||
| ## Usage | ||
| In all cases, the relevant function takes an argument representing data and an | ||
| optional second argument representing the starting "seed" (for running hash). | ||
| The return value is a signed 32-bit integer. | ||
| - `ADLER32.buf(byte array or buffer[, seed])` assumes the argument is a sequence | ||
| of 8-bit unsigned integers (e.g. nodejs `Buffer` or simple array of ints). | ||
| - `ADLER32.bstr(binary string[, seed])` assumes the argument as a binary string | ||
| where byte `i` is the low byte of the UCS-2 char: `str.charCodeAt(i) & 0xFF` | ||
| - `ADLER32.str(string)` assumes the argument as a standard JS string and | ||
| calculates the hash of the UTF-8 encoding. | ||
| For example: | ||
| ```js | ||
| // var ADLER32 = require('adler-32'); // uncomment if in node | ||
| ADLER32.str("SheetJS") // 176947863 | ||
| ADLER32.bstr("SheetJS") // 176947863 | ||
| ADLER32.buf([ 83, 104, 101, 101, 116, 74, 83 ]) // 176947863 | ||
| adler32 = ADLER32.buf([83, 104]) // 17825980 "Sh" | ||
| adler32 = ADLER32.str("eet", adler32) // 95486458 "Sheet" | ||
| ADLER32.bstr("JS", adler32) // 176947863 "SheetJS" | ||
| [ADLER32.str("\u2603"), ADLER32.str("\u0003")] // [ 73138686, 262148 ] | ||
| [ADLER32.bstr("\u2603"), ADLER32.bstr("\u0003")] // [ 262148, 262148 ] | ||
| [ADLER32.buf([0x2603]), ADLER32.buf([0x0003])] // [ 262148, 262148 ] | ||
| ``` | ||
| ## Testing | ||
| `make test` will run the nodejs-based test. | ||
| To run the in-browser tests, run a local server and go to the `ctest` directory. | ||
| `make ctestserv` will start a python `SimpleHTTPServer` server on port 8000. | ||
| To update the browser artifacts, run `make ctest`. | ||
| To generate the bits file, use the `adler32` function from python zlib: | ||
| ```python | ||
| >>> from zlib import adler32 | ||
| >>> x="foo bar baz٪☃🍣" | ||
| >>> adler32(x) | ||
| 1543572022 | ||
| >>> adler32(x+x) | ||
| -2076896149 | ||
| >>> adler32(x+x+x) | ||
| 2023497376 | ||
| ``` | ||
| The included `adler32.njs` script can process files or stdin: | ||
| ```bash | ||
| $ echo "this is a test" > t.txt | ||
| $ bin/adler32.njs t.txt | ||
| 726861088 | ||
| ``` | ||
| For comparison, the included `adler32.py` script uses python zlib: | ||
| ```bash | ||
| $ bin/adler32.py t.txt | ||
| 726861088 | ||
| ``` | ||
| ## Performance | ||
| `make perf` will run algorithmic performance tests (which should justify certain | ||
| decisions in the code). | ||
| Bit twiddling is much faster than taking the mod on Safari and older Firefoxes. | ||
| Instead of taking the literal mod 65521, it is faster to keep it in the integers | ||
| by bit-shifting: `65536 ~ 15 mod 65521` so for nonnegative integer `a`: | ||
| ``` | ||
| a = (a >>> 16) * 65536 + (a & 65535) [equality] | ||
| a ~ (a >>> 16) * 15 + (a & 65535) mod 65521 | ||
| ``` | ||
| The mod is taken at the very end, since the intermediate result may exceed 65521 | ||
| ## Magic Number | ||
| The magic numbers were chosen so as to not overflow a 31-bit integer: | ||
| ```mathematica | ||
| F[n_] := Reduce[x*(x + 1)*n/2 + (x + 1)*(65521) < (2^31 - 1) && x > 0, x, Integers] | ||
| F[255] (* bstr: x \[Element] Integers && 1 <= x <= 3854 *) | ||
| F[127] (* ascii: x \[Element] Integers && 1 <= x <= 5321 *) | ||
| ``` | ||
| Subtract up to 4 elements for the unicode case. | ||
| ## License | ||
| Please consult the attached LICENSE file for details. All rights not explicitly | ||
| granted by the Apache 2.0 license are reserved by the Original Author. | ||
| ## Badges | ||
| [](https://saucelabs.com/u/adler32) | ||
| [](https://travis-ci.org/SheetJS/js-adler32) | ||
| [](https://coveralls.io/r/SheetJS/js-adler32?branch=master) | ||
| [](https://github.com/SheetJS/js-adler32) |
+10
-10
@@ -24,12 +24,10 @@ /* adler32.js (C) 2014-present SheetJS -- http://sheetjs.com */ | ||
| }(function(ADLER32) { | ||
| ADLER32.version = '0.4.0'; | ||
| /*global Buffer */ | ||
| var use_buffer = typeof Buffer !== 'undefined'; | ||
| function adler32_bstr(bstr) { | ||
| if(bstr.length > 32768) if(use_buffer) return adler32_buf(new Buffer(bstr)); | ||
| ADLER32.version = '1.0.0'; | ||
| function adler32_bstr(bstr, seed) { | ||
| var a = 1, b = 0, L = bstr.length, M = 0; | ||
| if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; } | ||
| for(var i = 0; i < L;) { | ||
| M = Math.min(L-i, 3850)+i; | ||
| for(;i<M;i++) { | ||
| a += bstr.charCodeAt(i); | ||
| a += bstr.charCodeAt(i)&0xFF; | ||
| b += a; | ||
@@ -43,8 +41,9 @@ } | ||
| function adler32_buf(buf) { | ||
| function adler32_buf(buf, seed) { | ||
| var a = 1, b = 0, L = buf.length, M = 0; | ||
| if(typeof seed === 'number') { a = seed & 0xFFFF; b = (seed >>> 16) & 0xFFFF; } | ||
| for(var i = 0; i < L;) { | ||
| M = Math.min(L-i, 3850)+i; | ||
| for(;i<M;i++) { | ||
| a += buf[i]; | ||
| a += buf[i]&0xFF; | ||
| b += a; | ||
@@ -58,4 +57,5 @@ } | ||
| function adler32_str(str) { | ||
| function adler32_str(str, seed) { | ||
| var a = 1, b = 0, L = str.length, M = 0, c = 0, d = 0; | ||
| if(typeof seed === 'number') { a = seed & 0xFFFF; b = seed >>> 16; } | ||
| for(var i = 0; i < L;) { | ||
@@ -85,3 +85,3 @@ M = Math.min(L-i, 3850); | ||
| } | ||
| return (b << 16) | a; | ||
| return ((b%65521) << 16) | (a%65521); | ||
| } | ||
@@ -88,0 +88,0 @@ ADLER32.bstr = adler32_bstr; |
+2
-2
| { | ||
| "name": "adler-32", | ||
| "version": "0.4.0", | ||
| "version": "1.0.0", | ||
| "author": "sheetjs", | ||
@@ -13,2 +13,3 @@ "description": "Pure-JS ADLER-32", | ||
| "concat-stream":"", | ||
| "printj":"", | ||
| "exit-on-epipe":"" | ||
@@ -18,3 +19,2 @@ }, | ||
| "mocha":"", | ||
| "xlsjs":"", | ||
| "codepage":"" | ||
@@ -21,0 +21,0 @@ }, |
Sorry, the diff of this file is not supported yet
Wildcard dependency
QualityPackage has a dependency with a floating version range. This can cause issues if the dependency publishes a new major version.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
10951
141.58%2
-33.33%5
25%1
-50%141
Infinity%3
50%+ Added
+ Added