StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.1 KiB
138 lines
3.1 KiB
/*
|
|
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
|
|
* in FIPS PUB 180-1
|
|
* Version 2.1a Copyright Paul Johnston 2000 - 2002.
|
|
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
|
|
* Distributed under the BSD License
|
|
* See http://pajhome.org.uk/crypt/md5 for details.
|
|
*/
|
|
|
|
var inherits = require('util').inherits
|
|
|
|
module.exports = function (Buffer, Hash) {
|
|
|
|
var A = 0|0
|
|
var B = 4|0
|
|
var C = 8|0
|
|
var D = 12|0
|
|
var E = 16|0
|
|
|
|
var W = new (typeof Int32Array === 'undefined' ? Array : Int32Array)(80)
|
|
|
|
var POOL = []
|
|
|
|
function Sha1 () {
|
|
if(POOL.length)
|
|
return POOL.pop().init()
|
|
|
|
if(!(this instanceof Sha1)) return new Sha1()
|
|
this._w = W
|
|
Hash.call(this, 16*4, 14*4)
|
|
|
|
this._h = null
|
|
this.init()
|
|
}
|
|
|
|
inherits(Sha1, Hash)
|
|
|
|
Sha1.prototype.init = function () {
|
|
this._a = 0x67452301
|
|
this._b = 0xefcdab89
|
|
this._c = 0x98badcfe
|
|
this._d = 0x10325476
|
|
this._e = 0xc3d2e1f0
|
|
|
|
Hash.prototype.init.call(this)
|
|
return this
|
|
}
|
|
|
|
Sha1.prototype._POOL = POOL
|
|
Sha1.prototype._update = function (X) {
|
|
|
|
var a, b, c, d, e, _a, _b, _c, _d, _e
|
|
|
|
a = _a = this._a
|
|
b = _b = this._b
|
|
c = _c = this._c
|
|
d = _d = this._d
|
|
e = _e = this._e
|
|
|
|
var w = this._w
|
|
|
|
for(var j = 0; j < 80; j++) {
|
|
var W = w[j] = j < 16 ? X.readInt32BE(j*4)
|
|
: rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1)
|
|
|
|
var t = add(
|
|
add(rol(a, 5), sha1_ft(j, b, c, d)),
|
|
add(add(e, W), sha1_kt(j))
|
|
)
|
|
|
|
e = d
|
|
d = c
|
|
c = rol(b, 30)
|
|
b = a
|
|
a = t
|
|
}
|
|
|
|
this._a = add(a, _a)
|
|
this._b = add(b, _b)
|
|
this._c = add(c, _c)
|
|
this._d = add(d, _d)
|
|
this._e = add(e, _e)
|
|
}
|
|
|
|
Sha1.prototype._hash = function () {
|
|
if(POOL.length < 100) POOL.push(this)
|
|
var H = new Buffer(20)
|
|
//console.log(this._a|0, this._b|0, this._c|0, this._d|0, this._e|0)
|
|
H.writeInt32BE(this._a|0, A)
|
|
H.writeInt32BE(this._b|0, B)
|
|
H.writeInt32BE(this._c|0, C)
|
|
H.writeInt32BE(this._d|0, D)
|
|
H.writeInt32BE(this._e|0, E)
|
|
return H
|
|
}
|
|
|
|
/*
|
|
* Perform the appropriate triplet combination function for the current
|
|
* iteration
|
|
*/
|
|
function sha1_ft(t, b, c, d) {
|
|
if(t < 20) return (b & c) | ((~b) & d);
|
|
if(t < 40) return b ^ c ^ d;
|
|
if(t < 60) return (b & c) | (b & d) | (c & d);
|
|
return b ^ c ^ d;
|
|
}
|
|
|
|
/*
|
|
* Determine the appropriate additive constant for the current iteration
|
|
*/
|
|
function sha1_kt(t) {
|
|
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
|
|
(t < 60) ? -1894007588 : -899497514;
|
|
}
|
|
|
|
/*
|
|
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
|
|
* to work around bugs in some JS interpreters.
|
|
* //dominictarr: this is 10 years old, so maybe this can be dropped?)
|
|
*
|
|
*/
|
|
function add(x, y) {
|
|
return (x + y ) | 0
|
|
//lets see how this goes on testling.
|
|
// var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
|
// var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
// return (msw << 16) | (lsw & 0xFFFF);
|
|
}
|
|
|
|
/*
|
|
* Bitwise rotate a 32-bit number to the left.
|
|
*/
|
|
function rol(num, cnt) {
|
|
return (num << cnt) | (num >>> (32 - cnt));
|
|
}
|
|
|
|
return Sha1
|
|
}
|
|
|