Skip to content

Commit

Permalink
some performance improvement
Browse files Browse the repository at this point in the history
  • Loading branch information
fanatid committed Jan 26, 2016
1 parent 9a2d222 commit 733eead
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 59 deletions.
4 changes: 3 additions & 1 deletion .gitignore
@@ -1 +1,3 @@
node_modules/
node_modules

npm-debug.log
4 changes: 2 additions & 2 deletions benchmark/benchmark.js
Expand Up @@ -3,8 +3,8 @@
var crypto = require('crypto')
var benchmark = require('benchmark')

var baseX = require('../')
var bs58 = baseX('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz')
var bs58ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
var bs58 = require('../')(bs58ALPHABET)

var fixtureIndex = 0
var resetFixtureIndex = function () { fixtureIndex = 0 }
Expand Down
88 changes: 49 additions & 39 deletions index.js
Expand Up @@ -6,6 +6,10 @@
// Merged Buffer refactorings from base58-native by Stephen Pair
// Copyright (c) 2013 BitPay Inc

/**
* @param {string} ALPHABET
* @return {encode: function, decode: function}
*/
module.exports = function base (ALPHABET) {
var ALPHABET_MAP = {}
var BASE = ALPHABET.length
Expand All @@ -16,76 +20,82 @@ module.exports = function base (ALPHABET) {
ALPHABET_MAP[ALPHABET.charAt(i)] = i
}

function encode (buffer) {
if (buffer.length === 0) return ''
/**
* @param {(Buffer|number[])} source
* @return {string}
*/
function encode (source) {
if (source.length === 0) {
return ''
}

var i, j
var digits = [0]

for (i = 0; i < buffer.length; i++) {
for (j = 0; j < digits.length; j++) digits[j] <<= 8

digits[0] += buffer[i]

var carry = 0
for (j = 0; j < digits.length; ++j) {
digits[j] += carry

carry = (digits[j] / BASE) | 0
digits[j] %= BASE
for (var i = 0; i < source.length; ++i) {
var carry = (digits[0] << 8) + source[i]
digits[0] = carry % BASE
carry = (carry / BASE) | 0

for (var j = 1; j < digits.length; ++j) {
carry += digits[j] << 8
digits[j] = carry % BASE
carry = (carry / BASE) | 0
}

while (carry) {
while (carry > 0) {
digits.push(carry % BASE)

carry = (carry / BASE) | 0
}
}

// deal with leading zeros
for (i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) {
for (var k = 0; source[k] === 0 && k < source.length - 1; ++k) {
digits.push(0)
}

// convert digits to a string
var str = ''
for (i = digits.length - 1; i >= 0; i--) {
str += ALPHABET[digits[i]]
for (var ii = 0, jj = digits.length - 1; ii <= jj; ++ii, --jj) {
var tmp = ALPHABET[digits[ii]]
digits[ii] = ALPHABET[digits[jj]]
digits[jj] = tmp
}

return str
return digits.join('')
}

/**
* @param {string} string
* @return {number[]}
*/
function decode (string) {
if (string.length === 0) return []
if (string.length === 0) {
return []
}

var i, j
var bytes = [0]
for (var i = 0; i < string.length; i++) {
var value = ALPHABET_MAP[string[i]]
if (value === undefined) {
throw new Error('Non-base' + BASE + ' character')
}

for (i = 0; i < string.length; i++) {
var c = string[i]
if (!(c in ALPHABET_MAP)) throw new Error('Non-base' + BASE + ' character')

for (j = 0; j < bytes.length; j++) bytes[j] *= BASE
bytes[0] += ALPHABET_MAP[c]

var carry = 0
for (j = 0; j < bytes.length; ++j) {
bytes[j] += carry
var carry = bytes[0] * BASE + value
bytes[0] = carry & 0xff
carry >>= 8

carry = bytes[j] >> 8
bytes[j] &= 0xff
for (var j = 1; j < bytes.length; ++j) {
carry += bytes[j] * BASE
bytes[j] = carry & 0xff
carry >>= 8
}

while (carry) {
while (carry > 0) {
bytes.push(carry & 0xff)

carry >>= 8
}
}

// deal with leading zeros
for (i = 0; string[i] === LEADER && i < string.length - 1; i++) {
for (var k = 0; string[k] === LEADER && k < string.length - 1; ++k) {
bytes.push(0)
}

Expand Down
36 changes: 19 additions & 17 deletions package.json
Expand Up @@ -2,20 +2,6 @@
"name": "base-x",
"version": "1.0.2",
"description": "Fast base encoding / decoding of any given alphabet",
"main": "index.js",
"scripts": {
"standard": "standard",
"test": "npm run unit && npm run standard",
"unit": "mocha"
},
"repository": {
"type": "git",
"url": "https://github.com/dcousens/base-x.git"
},
"bugs": {
"url": "https://github.com/dcousens/base-x/issues"
},
"homepage": "https://github.com/dcousens/base-x",
"keywords": [
"base-x",
"base58",
Expand All @@ -28,15 +14,31 @@
"encode",
"encoding"
],
"author": "Daniel Cousens",
"homepage": "https://github.com/cryptocoinjs/base-x",
"bugs": {
"url": "https://github.com/cryptocoinjs/base-x/issues"
},
"license": "MIT",
"author": "Daniel Cousens",
"files": [
"index.js",
"README.md"
],
"main": "index.js",
"repository": {
"type": "git",
"url": "https://github.com/cryptocoinjs/base-x.git"
},
"scripts": {
"benchmark:node": "node benchmark/benchmark.js",
"standard": "standard",
"test": "npm run unit && npm run standard",
"unit": "mocha"
},
"devDependencies": {
"benchmark": "^2.0.0",
"mocha": "*",
"standard": "*"
"mocha": "^2.3.4",
"node-gyp": "^3.2.1",
"standard": "^5.4.1"
}
}

0 comments on commit 733eead

Please sign in to comment.