zoukankan      html  css  js  c++  java
  • js 代码保存

     1 var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
     2 var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
     3     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
     4     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
     5     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
     6 
     7 function base64encode(str) {
     8     var out, i, len;
     9     var c1, c2, c3;
    10 
    11     len = str.length;
    12     i = 0;
    13     out = "";
    14     while (i < len) {
    15         c1 = str.charCodeAt(i++) & 0xff;
    16         if (i == len) {
    17             out += base64EncodeChars.charAt(c1 >> 2);
    18             out += base64EncodeChars.charAt((c1 & 0x3) << 4);
    19             out += "==";
    20             break;
    21         }
    22         c2 = str.charCodeAt(i++);
    23         if (i == len) {
    24             out += base64EncodeChars.charAt(c1 >> 2);
    25             out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
    26             out += base64EncodeChars.charAt((c2 & 0xF) << 2);
    27             out += "=";
    28             break;
    29         }
    30         c3 = str.charCodeAt(i++);
    31         out += base64EncodeChars.charAt(c1 >> 2);
    32         out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
    33         out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
    34         out += base64EncodeChars.charAt(c3 & 0x3F);
    35     }
    36     return out;
    37 }
    38 
    39 function base64decode(str) {
    40     var c1, c2, c3, c4;
    41     var i, len, out;
    42 
    43     len = str.length;
    44     i = 0;
    45     out = "";
    46     while (i < len) {
    47         /* c1 */
    48         do {
    49             c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    50         } while (i < len && c1 == -1);
    51         if (c1 == -1)
    52             break;
    53 
    54         /* c2 */
    55         do {
    56             c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
    57         } while (i < len && c2 == -1);
    58         if (c2 == -1)
    59             break;
    60 
    61         out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
    62 
    63         /* c3 */
    64         do {
    65             c3 = str.charCodeAt(i++) & 0xff;
    66             if (c3 == 61)
    67                 return out;
    68             c3 = base64DecodeChars[c3];
    69         } while (i < len && c3 == -1);
    70         if (c3 == -1)
    71             break;
    72 
    73         out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
    74 
    75         /* c4 */
    76         do {
    77             c4 = str.charCodeAt(i++) & 0xff;
    78             if (c4 == 61)
    79                 return out;
    80             c4 = base64DecodeChars[c4];
    81         } while (i < len && c4 == -1);
    82         if (c4 == -1)
    83             break;
    84         out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    85     }
    86     return out;
    87 }
    function hexToBytes(hex) {
        for (var bytes = [], c = 0; c < hex.length; c += 2)
            bytes.push(parseInt(hex.substr(c, 2), 16));
        return bytes;
    }
    
    function stringToBytes(str) {
        var ch, st, re = [];
        for (var i = 0; i < str.length; i++) {
            ch = str.charCodeAt(i); // get char   
            st = []; // set up "stack"  
            do {
                st.push(ch & 0xFF); // push byte to stack  
                ch = ch >> 8; // shift value down by 1 byte  
            }
            while (ch);
            // add stack contents to result  
            // done because chars have "wrong" endianness  
            re = re.concat(st.reverse());
        }
        // return an array of bytes  
        return re;
    }
    
    function wordToByteArray(wordArray) {
        var byteArray = [],
            word, i, j;
        for (i = 0; i < wordArray.length; ++i) {
            word = wordArray[i];
            for (j = 3; j >= 0; --j) {
                byteArray.push((word >> 8 * j) & 0xFF);
            }
        }
        return byteArray;
    }
      1 (function(factory) {
      2     if (typeof exports === 'object') {
      3         // Node/CommonJS
      4         module.exports = factory();
      5     } else if (typeof define === 'function' && define.amd) {
      6         // AMD
      7         define(factory);
      8     } else {
      9         // Browser globals (with support for web workers)
     10         var glob;
     11 
     12         try {
     13             glob = window;
     14         } catch (e) {
     15             glob = self;
     16         }
     17 
     18         glob.SparkMD5 = factory();
     19     }
     20 }(function(undefined) {
     21 
     22     'use strict';
     23 
     24     /*
     25      * Fastest md5 implementation around (JKM md5).
     26      * Credits: Joseph Myers
     27      *
     28      * @see http://www.myersdaily.org/joseph/javascript/md5-text.html
     29      * @see http://jsperf.com/md5-shootout/7
     30      */
     31 
     32     /* this function is much faster,
     33       so if possible we use it. Some IEs
     34       are the only ones I know of that
     35       need the idiotic second function,
     36       generated by an if clause.  */
     37     var add32 = function(a, b) {
     38             return (a + b) & 0xFFFFFFFF;
     39         },
     40         hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
     41 
     42 
     43     function cmn(q, a, b, x, s, t) {
     44         a = add32(add32(a, q), add32(x, t));
     45         return add32((a << s) | (a >>> (32 - s)), b);
     46     }
     47 
     48     function md5cycle(x, k) {
     49         var a = x[0],
     50             b = x[1],
     51             c = x[2],
     52             d = x[3];
     53 
     54         a += (b & c | ~b & d) + k[0] - 680876936 | 0;
     55         a = (a << 7 | a >>> 25) + b | 0;
     56         d += (a & b | ~a & c) + k[1] - 389564586 | 0;
     57         d = (d << 12 | d >>> 20) + a | 0;
     58         c += (d & a | ~d & b) + k[2] + 606105819 | 0;
     59         c = (c << 17 | c >>> 15) + d | 0;
     60         b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
     61         b = (b << 22 | b >>> 10) + c | 0;
     62         a += (b & c | ~b & d) + k[4] - 176418897 | 0;
     63         a = (a << 7 | a >>> 25) + b | 0;
     64         d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
     65         d = (d << 12 | d >>> 20) + a | 0;
     66         c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
     67         c = (c << 17 | c >>> 15) + d | 0;
     68         b += (c & d | ~c & a) + k[7] - 45705983 | 0;
     69         b = (b << 22 | b >>> 10) + c | 0;
     70         a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
     71         a = (a << 7 | a >>> 25) + b | 0;
     72         d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
     73         d = (d << 12 | d >>> 20) + a | 0;
     74         c += (d & a | ~d & b) + k[10] - 42063 | 0;
     75         c = (c << 17 | c >>> 15) + d | 0;
     76         b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
     77         b = (b << 22 | b >>> 10) + c | 0;
     78         a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
     79         a = (a << 7 | a >>> 25) + b | 0;
     80         d += (a & b | ~a & c) + k[13] - 40341101 | 0;
     81         d = (d << 12 | d >>> 20) + a | 0;
     82         c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
     83         c = (c << 17 | c >>> 15) + d | 0;
     84         b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
     85         b = (b << 22 | b >>> 10) + c | 0;
     86 
     87         a += (b & d | c & ~d) + k[1] - 165796510 | 0;
     88         a = (a << 5 | a >>> 27) + b | 0;
     89         d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
     90         d = (d << 9 | d >>> 23) + a | 0;
     91         c += (d & b | a & ~b) + k[11] + 643717713 | 0;
     92         c = (c << 14 | c >>> 18) + d | 0;
     93         b += (c & a | d & ~a) + k[0] - 373897302 | 0;
     94         b = (b << 20 | b >>> 12) + c | 0;
     95         a += (b & d | c & ~d) + k[5] - 701558691 | 0;
     96         a = (a << 5 | a >>> 27) + b | 0;
     97         d += (a & c | b & ~c) + k[10] + 38016083 | 0;
     98         d = (d << 9 | d >>> 23) + a | 0;
     99         c += (d & b | a & ~b) + k[15] - 660478335 | 0;
    100         c = (c << 14 | c >>> 18) + d | 0;
    101         b += (c & a | d & ~a) + k[4] - 405537848 | 0;
    102         b = (b << 20 | b >>> 12) + c | 0;
    103         a += (b & d | c & ~d) + k[9] + 568446438 | 0;
    104         a = (a << 5 | a >>> 27) + b | 0;
    105         d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
    106         d = (d << 9 | d >>> 23) + a | 0;
    107         c += (d & b | a & ~b) + k[3] - 187363961 | 0;
    108         c = (c << 14 | c >>> 18) + d | 0;
    109         b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
    110         b = (b << 20 | b >>> 12) + c | 0;
    111         a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
    112         a = (a << 5 | a >>> 27) + b | 0;
    113         d += (a & c | b & ~c) + k[2] - 51403784 | 0;
    114         d = (d << 9 | d >>> 23) + a | 0;
    115         c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
    116         c = (c << 14 | c >>> 18) + d | 0;
    117         b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
    118         b = (b << 20 | b >>> 12) + c | 0;
    119 
    120         a += (b ^ c ^ d) + k[5] - 378558 | 0;
    121         a = (a << 4 | a >>> 28) + b | 0;
    122         d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
    123         d = (d << 11 | d >>> 21) + a | 0;
    124         c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
    125         c = (c << 16 | c >>> 16) + d | 0;
    126         b += (c ^ d ^ a) + k[14] - 35309556 | 0;
    127         b = (b << 23 | b >>> 9) + c | 0;
    128         a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
    129         a = (a << 4 | a >>> 28) + b | 0;
    130         d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
    131         d = (d << 11 | d >>> 21) + a | 0;
    132         c += (d ^ a ^ b) + k[7] - 155497632 | 0;
    133         c = (c << 16 | c >>> 16) + d | 0;
    134         b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
    135         b = (b << 23 | b >>> 9) + c | 0;
    136         a += (b ^ c ^ d) + k[13] + 681279174 | 0;
    137         a = (a << 4 | a >>> 28) + b | 0;
    138         d += (a ^ b ^ c) + k[0] - 358537222 | 0;
    139         d = (d << 11 | d >>> 21) + a | 0;
    140         c += (d ^ a ^ b) + k[3] - 722521979 | 0;
    141         c = (c << 16 | c >>> 16) + d | 0;
    142         b += (c ^ d ^ a) + k[6] + 76029189 | 0;
    143         b = (b << 23 | b >>> 9) + c | 0;
    144         a += (b ^ c ^ d) + k[9] - 640364487 | 0;
    145         a = (a << 4 | a >>> 28) + b | 0;
    146         d += (a ^ b ^ c) + k[12] - 421815835 | 0;
    147         d = (d << 11 | d >>> 21) + a | 0;
    148         c += (d ^ a ^ b) + k[15] + 530742520 | 0;
    149         c = (c << 16 | c >>> 16) + d | 0;
    150         b += (c ^ d ^ a) + k[2] - 995338651 | 0;
    151         b = (b << 23 | b >>> 9) + c | 0;
    152 
    153         a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
    154         a = (a << 6 | a >>> 26) + b | 0;
    155         d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
    156         d = (d << 10 | d >>> 22) + a | 0;
    157         c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
    158         c = (c << 15 | c >>> 17) + d | 0;
    159         b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
    160         b = (b << 21 | b >>> 11) + c | 0;
    161         a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
    162         a = (a << 6 | a >>> 26) + b | 0;
    163         d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
    164         d = (d << 10 | d >>> 22) + a | 0;
    165         c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
    166         c = (c << 15 | c >>> 17) + d | 0;
    167         b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
    168         b = (b << 21 | b >>> 11) + c | 0;
    169         a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
    170         a = (a << 6 | a >>> 26) + b | 0;
    171         d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
    172         d = (d << 10 | d >>> 22) + a | 0;
    173         c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
    174         c = (c << 15 | c >>> 17) + d | 0;
    175         b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
    176         b = (b << 21 | b >>> 11) + c | 0;
    177         a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
    178         a = (a << 6 | a >>> 26) + b | 0;
    179         d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
    180         d = (d << 10 | d >>> 22) + a | 0;
    181         c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
    182         c = (c << 15 | c >>> 17) + d | 0;
    183         b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
    184         b = (b << 21 | b >>> 11) + c | 0;
    185 
    186         x[0] = a + x[0] | 0;
    187         x[1] = b + x[1] | 0;
    188         x[2] = c + x[2] | 0;
    189         x[3] = d + x[3] | 0;
    190     }
    191 
    192     function md5blk(s) {
    193         var md5blks = [],
    194             i; /* Andy King said do it this way. */
    195 
    196         for (i = 0; i < 64; i += 4) {
    197             md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
    198         }
    199         return md5blks;
    200     }
    201 
    202     function md5blk_array(a) {
    203         var md5blks = [],
    204             i; /* Andy King said do it this way. */
    205 
    206         for (i = 0; i < 64; i += 4) {
    207             md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
    208         }
    209         return md5blks;
    210     }
    211 
    212     function md51(s) {
    213         var n = s.length,
    214             state = [1732584193, -271733879, -1732584194, 271733878],
    215             i,
    216             length,
    217             tail,
    218             tmp,
    219             lo,
    220             hi;
    221 
    222         for (i = 64; i <= n; i += 64) {
    223             md5cycle(state, md5blk(s.substring(i - 64, i)));
    224         }
    225         s = s.substring(i - 64);
    226         length = s.length;
    227         tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    228         for (i = 0; i < length; i += 1) {
    229             tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
    230         }
    231         tail[i >> 2] |= 0x80 << ((i % 4) << 3);
    232         if (i > 55) {
    233             md5cycle(state, tail);
    234             for (i = 0; i < 16; i += 1) {
    235                 tail[i] = 0;
    236             }
    237         }
    238 
    239         // Beware that the final length might not fit in 32 bits so we take care of that
    240         tmp = n * 8;
    241         tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
    242         lo = parseInt(tmp[2], 16);
    243         hi = parseInt(tmp[1], 16) || 0;
    244 
    245         tail[14] = lo;
    246         tail[15] = hi;
    247 
    248         md5cycle(state, tail);
    249         return state;
    250     }
    251 
    252     function md51_array(a) {
    253         var n = a.length,
    254             state = [1732584193, -271733879, -1732584194, 271733878],
    255             i,
    256             length,
    257             tail,
    258             tmp,
    259             lo,
    260             hi;
    261 
    262         for (i = 64; i <= n; i += 64) {
    263             md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
    264         }
    265 
    266         // Not sure if it is a bug, however IE10 will always produce a sub array of length 1
    267         // containing the last element of the parent array if the sub array specified starts
    268         // beyond the length of the parent array - weird.
    269         // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
    270         a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
    271 
    272         length = a.length;
    273         tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    274         for (i = 0; i < length; i += 1) {
    275             tail[i >> 2] |= a[i] << ((i % 4) << 3);
    276         }
    277 
    278         tail[i >> 2] |= 0x80 << ((i % 4) << 3);
    279         if (i > 55) {
    280             md5cycle(state, tail);
    281             for (i = 0; i < 16; i += 1) {
    282                 tail[i] = 0;
    283             }
    284         }
    285 
    286         // Beware that the final length might not fit in 32 bits so we take care of that
    287         tmp = n * 8;
    288         tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
    289         lo = parseInt(tmp[2], 16);
    290         hi = parseInt(tmp[1], 16) || 0;
    291 
    292         tail[14] = lo;
    293         tail[15] = hi;
    294 
    295         md5cycle(state, tail);
    296 
    297         return state;
    298     }
    299 
    300     function rhex(n) {
    301         var s = '',
    302             j;
    303         for (j = 0; j < 4; j += 1) {
    304             s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
    305         }
    306         return s;
    307     }
    308 
    309     function hex(x) {
    310         var i;
    311         for (i = 0; i < x.length; i += 1) {
    312             x[i] = rhex(x[i]);
    313         }
    314         return x.join('');
    315     }
    316 
    317     // In some cases the fast add32 function cannot be used..
    318     if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {
    319         add32 = function(x, y) {
    320             var lsw = (x & 0xFFFF) + (y & 0xFFFF),
    321                 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    322             return (msw << 16) | (lsw & 0xFFFF);
    323         };
    324     }
    325 
    326     // ---------------------------------------------------
    327 
    328     /**
    329      * ArrayBuffer slice polyfill.
    330      *
    331      * @see https://github.com/ttaubert/node-arraybuffer-slice
    332      */
    333 
    334     if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
    335         (function() {
    336             function clamp(val, length) {
    337                 val = (val | 0) || 0;
    338 
    339                 if (val < 0) {
    340                     return Math.max(val + length, 0);
    341                 }
    342 
    343                 return Math.min(val, length);
    344             }
    345 
    346             ArrayBuffer.prototype.slice = function(from, to) {
    347                 var length = this.byteLength,
    348                     begin = clamp(from, length),
    349                     end = length,
    350                     num,
    351                     target,
    352                     targetArray,
    353                     sourceArray;
    354 
    355                 if (to !== undefined) {
    356                     end = clamp(to, length);
    357                 }
    358 
    359                 if (begin > end) {
    360                     return new ArrayBuffer(0);
    361                 }
    362 
    363                 num = end - begin;
    364                 target = new ArrayBuffer(num);
    365                 targetArray = new Uint8Array(target);
    366 
    367                 sourceArray = new Uint8Array(this, begin, num);
    368                 targetArray.set(sourceArray);
    369 
    370                 return target;
    371             };
    372         })();
    373     }
    374 
    375     // ---------------------------------------------------
    376 
    377     /**
    378      * Helpers.
    379      */
    380 
    381     function toUtf8(str) {
    382         if (/[u0080-uFFFF]/.test(str)) {
    383             str = unescape(encodeURIComponent(str));
    384         }
    385 
    386         return str;
    387     }
    388 
    389     function utf8Str2ArrayBuffer(str, returnUInt8Array) {
    390         var length = str.length,
    391             buff = new ArrayBuffer(length),
    392             arr = new Uint8Array(buff),
    393             i;
    394 
    395         for (i = 0; i < length; i += 1) {
    396             arr[i] = str.charCodeAt(i);
    397         }
    398 
    399         return returnUInt8Array ? arr : buff;
    400     }
    401 
    402     function arrayBuffer2Utf8Str(buff) {
    403         return String.fromCharCode.apply(null, new Uint8Array(buff));
    404     }
    405 
    406     function concatenateArrayBuffers(first, second, returnUInt8Array) {
    407         var result = new Uint8Array(first.byteLength + second.byteLength);
    408 
    409         result.set(new Uint8Array(first));
    410         result.set(new Uint8Array(second), first.byteLength);
    411 
    412         return returnUInt8Array ? result : result.buffer;
    413     }
    414 
    415     function hexToBinaryString(hex) {
    416         var bytes = [],
    417             length = hex.length,
    418             x;
    419 
    420         for (x = 0; x < length - 1; x += 2) {
    421             bytes.push(parseInt(hex.substr(x, 2), 16));
    422         }
    423 
    424         return String.fromCharCode.apply(String, bytes);
    425     }
    426 
    427     // ---------------------------------------------------
    428 
    429     /**
    430      * SparkMD5 OOP implementation.
    431      *
    432      * Use this class to perform an incremental md5, otherwise use the
    433      * static methods instead.
    434      */
    435 
    436     function SparkMD5() {
    437         // call reset to init the instance
    438         this.reset();
    439     }
    440 
    441     /**
    442      * Appends a string.
    443      * A conversion will be applied if an utf8 string is detected.
    444      *
    445      * @param {String} str The string to be appended
    446      *
    447      * @return {SparkMD5} The instance itself
    448      */
    449     SparkMD5.prototype.append = function(str) {
    450         // Converts the string to utf8 bytes if necessary
    451         // Then append as binary
    452         this.appendBinary(toUtf8(str));
    453 
    454         return this;
    455     };
    456 
    457     /**
    458      * Appends a binary string.
    459      *
    460      * @param {String} contents The binary string to be appended
    461      *
    462      * @return {SparkMD5} The instance itself
    463      */
    464     SparkMD5.prototype.appendBinary = function(contents) {
    465         this._buff += contents;
    466         this._length += contents.length;
    467 
    468         var length = this._buff.length,
    469             i;
    470 
    471         for (i = 64; i <= length; i += 64) {
    472             md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));
    473         }
    474 
    475         this._buff = this._buff.substring(i - 64);
    476 
    477         return this;
    478     };
    479 
    480     /**
    481      * Finishes the incremental computation, reseting the internal state and
    482      * returning the result.
    483      *
    484      * @param {Boolean} raw True to get the raw string, false to get the hex string
    485      *
    486      * @return {String} The result
    487      */
    488     SparkMD5.prototype.end = function(raw) {
    489         var buff = this._buff,
    490             length = buff.length,
    491             i,
    492             tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    493             ret;
    494 
    495         for (i = 0; i < length; i += 1) {
    496             tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
    497         }
    498 
    499         this._finish(tail, length);
    500         ret = hex(this._hash);
    501 
    502         if (raw) {
    503             ret = hexToBinaryString(ret);
    504         }
    505 
    506         this.reset();
    507 
    508         return ret;
    509     };
    510 
    511     /**
    512      * Resets the internal state of the computation.
    513      *
    514      * @return {SparkMD5} The instance itself
    515      */
    516     SparkMD5.prototype.reset = function() {
    517         this._buff = '';
    518         this._length = 0;
    519         this._hash = [1732584193, -271733879, -1732584194, 271733878];
    520 
    521         return this;
    522     };
    523 
    524     /**
    525      * Gets the internal state of the computation.
    526      *
    527      * @return {Object} The state
    528      */
    529     SparkMD5.prototype.getState = function() {
    530         return {
    531             buff: this._buff,
    532             length: this._length,
    533             hash: this._hash
    534         };
    535     };
    536 
    537     /**
    538      * Gets the internal state of the computation.
    539      *
    540      * @param {Object} state The state
    541      *
    542      * @return {SparkMD5} The instance itself
    543      */
    544     SparkMD5.prototype.setState = function(state) {
    545         this._buff = state.buff;
    546         this._length = state.length;
    547         this._hash = state.hash;
    548 
    549         return this;
    550     };
    551 
    552     /**
    553      * Releases memory used by the incremental buffer and other additional
    554      * resources. If you plan to use the instance again, use reset instead.
    555      */
    556     SparkMD5.prototype.destroy = function() {
    557         delete this._hash;
    558         delete this._buff;
    559         delete this._length;
    560     };
    561 
    562     /**
    563      * Finish the final calculation based on the tail.
    564      *
    565      * @param {Array}  tail   The tail (will be modified)
    566      * @param {Number} length The length of the remaining buffer
    567      */
    568     SparkMD5.prototype._finish = function(tail, length) {
    569         var i = length,
    570             tmp,
    571             lo,
    572             hi;
    573 
    574         tail[i >> 2] |= 0x80 << ((i % 4) << 3);
    575         if (i > 55) {
    576             md5cycle(this._hash, tail);
    577             for (i = 0; i < 16; i += 1) {
    578                 tail[i] = 0;
    579             }
    580         }
    581 
    582         // Do the final computation based on the tail and length
    583         // Beware that the final length may not fit in 32 bits so we take care of that
    584         tmp = this._length * 8;
    585         tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
    586         lo = parseInt(tmp[2], 16);
    587         hi = parseInt(tmp[1], 16) || 0;
    588 
    589         tail[14] = lo;
    590         tail[15] = hi;
    591         md5cycle(this._hash, tail);
    592     };
    593 
    594     /**
    595      * Performs the md5 hash on a string.
    596      * A conversion will be applied if utf8 string is detected.
    597      *
    598      * @param {String}  str The string
    599      * @param {Boolean} [raw] True to get the raw string, false to get the hex string
    600      *
    601      * @return {String} The result
    602      */
    603     SparkMD5.hash = function(str, raw) {
    604         // Converts the string to utf8 bytes if necessary
    605         // Then compute it using the binary function
    606         return SparkMD5.hashBinary(toUtf8(str), raw);
    607     };
    608 
    609     /**
    610      * Performs the md5 hash on a binary string.
    611      *
    612      * @param {String}  content The binary string
    613      * @param {Boolean} [raw]     True to get the raw string, false to get the hex string
    614      *
    615      * @return {String} The result
    616      */
    617     SparkMD5.hashBinary = function(content, raw) {
    618         var hash = md51(content),
    619             ret = hex(hash);
    620 
    621         return raw ? hexToBinaryString(ret) : ret;
    622     };
    623 
    624     // ---------------------------------------------------
    625 
    626     /**
    627      * SparkMD5 OOP implementation for array buffers.
    628      *
    629      * Use this class to perform an incremental md5 ONLY for array buffers.
    630      */
    631     SparkMD5.ArrayBuffer = function() {
    632         // call reset to init the instance
    633         this.reset();
    634     };
    635 
    636     /**
    637      * Appends an array buffer.
    638      *
    639      * @param {ArrayBuffer} arr The array to be appended
    640      *
    641      * @return {SparkMD5.ArrayBuffer} The instance itself
    642      */
    643     SparkMD5.ArrayBuffer.prototype.append = function(arr) {
    644         var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),
    645             length = buff.length,
    646             i;
    647 
    648         this._length += arr.byteLength;
    649 
    650         for (i = 64; i <= length; i += 64) {
    651             md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));
    652         }
    653 
    654         this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);
    655 
    656         return this;
    657     };
    658 
    659     /**
    660      * Finishes the incremental computation, reseting the internal state and
    661      * returning the result.
    662      *
    663      * @param {Boolean} raw True to get the raw string, false to get the hex string
    664      *
    665      * @return {String} The result
    666      */
    667     SparkMD5.ArrayBuffer.prototype.end = function(raw) {
    668         var buff = this._buff,
    669             length = buff.length,
    670             tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    671             i,
    672             ret;
    673 
    674         for (i = 0; i < length; i += 1) {
    675             tail[i >> 2] |= buff[i] << ((i % 4) << 3);
    676         }
    677 
    678         this._finish(tail, length);
    679         ret = hex(this._hash);
    680 
    681         if (raw) {
    682             ret = hexToBinaryString(ret);
    683         }
    684 
    685         this.reset();
    686 
    687         return ret;
    688     };
    689 
    690     /**
    691      * Resets the internal state of the computation.
    692      *
    693      * @return {SparkMD5.ArrayBuffer} The instance itself
    694      */
    695     SparkMD5.ArrayBuffer.prototype.reset = function() {
    696         this._buff = new Uint8Array(0);
    697         this._length = 0;
    698         this._hash = [1732584193, -271733879, -1732584194, 271733878];
    699 
    700         return this;
    701     };
    702 
    703     /**
    704      * Gets the internal state of the computation.
    705      *
    706      * @return {Object} The state
    707      */
    708     SparkMD5.ArrayBuffer.prototype.getState = function() {
    709         var state = SparkMD5.prototype.getState.call(this);
    710 
    711         // Convert buffer to a string
    712         state.buff = arrayBuffer2Utf8Str(state.buff);
    713 
    714         return state;
    715     };
    716 
    717     /**
    718      * Gets the internal state of the computation.
    719      *
    720      * @param {Object} state The state
    721      *
    722      * @return {SparkMD5.ArrayBuffer} The instance itself
    723      */
    724     SparkMD5.ArrayBuffer.prototype.setState = function(state) {
    725         // Convert string to buffer
    726         state.buff = utf8Str2ArrayBuffer(state.buff, true);
    727 
    728         return SparkMD5.prototype.setState.call(this, state);
    729     };
    730 
    731     SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
    732 
    733     SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
    734 
    735     /**
    736      * Performs the md5 hash on an array buffer.
    737      *
    738      * @param {ArrayBuffer} arr The array buffer
    739      * @param {Boolean}     [raw] True to get the raw string, false to get the hex one
    740      *
    741      * @return {String} The result
    742      */
    743     SparkMD5.ArrayBuffer.hash = function(arr, raw) {
    744         var hash = md51_array(new Uint8Array(arr)),
    745             ret = hex(hash);
    746 
    747         return raw ? hexToBinaryString(ret) : ret;
    748     };
    749 
    750     return SparkMD5;
    751 }));
    /*
     * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
     * in FIPS PUB 180-1
     * Version 2.1-BETA 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.
     */
    /*
     * Configurable variables. You may need to tweak these to be compatible with
     * the server-side, but the defaults work in most cases.
     */
    var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase     */
    var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance  */
    var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode    */
    /*
     * These are the functions you'll usually want to call
     * They take string arguments and return either hex or base-64 encoded strings
     */
    function hex_sha1(s) { 
        return binb2hex(core_sha1(str2binb(s), s.length * chrsz));
    }
    
    function b64_sha1(s) { 
        return binb2b64(core_sha1(str2binb(s), s.length * chrsz));
    }
    
    function str_sha1(s) { 
        return binb2str(core_sha1(str2binb(s), s.length * chrsz));
    }
    
    function hex_hmac_sha1(key, data) { 
        return binb2hex(core_hmac_sha1(key, data));
    }
    
    function b64_hmac_sha1(key, data) { 
        return binb2b64(core_hmac_sha1(key, data));
    }
    
    function str_hmac_sha1(key, data) { 
        return binb2str(core_hmac_sha1(key, data));
    }
    /*
     * Perform a simple self-test to see if the VM is working
     */
    function sha1_vm_test() { 
        return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
    }
    /*
     * Calculate the SHA-1 of an array of big-endian words, and a bit length
     */
    function core_sha1(x, len) {  /* append padding */  
        x[len >> 5] |= 0x80 << (24 - len % 32); 
        x[((len + 64 >> 9) << 4) + 15] = len; 
        var w = Array(80); 
        var a = 1732584193var b = -271733879var c = -1732584194var d = 271733878var e = -1009589776for (var i = 0; i < x.length; i += 16) {  
            var olda = a;  
            var oldb = b;  
            var oldc = c;  
            var oldd = d;  
            var olde = e;  
            for (var j = 0; j < 80; j++) {   
                if (j < 16) w[j] = x[i + j];   
                else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);   
                var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));   
                e = d;   
                d = c;   
                c = rol(b, 30);   
                b = a;   
                a = t;  
            }  
            a = safe_add(a, olda);  
            b = safe_add(b, oldb);  
            c = safe_add(c, oldc);  
            d = safe_add(d, oldd);  
            e = safe_add(e, olde); 
        } 
        return Array(a, b, c, d, e);
    }
    
    function reverse_word(x) {
        var a = (x[0] & 0xff) << 24 | (x[0] >> 8 & 0xff) << 16 | (x[0] >> 16 & 0xff) << 8 | (x[0] >> 24 & 0xff); 
        var b = (x[1] & 0xff) << 24 | (x[1] >> 8 & 0xff) << 16 | (x[1] >> 16 & 0xff) << 8 | (x[1] >> 24 & 0xff); 
        var c = (x[2] & 0xff) << 24 | (x[2] >> 8 & 0xff) << 16 | (x[2] >> 16 & 0xff) << 8 | (x[2] >> 24 & 0xff); 
        var d = (x[3] & 0xff) << 24 | (x[3] >> 8 & 0xff) << 16 | (x[3] >> 16 & 0xff) << 8 | (x[3] >> 24 & 0xff);  
        var e = (x[4] & 0xff) << 24 | (x[4] >> 8 & 0xff) << 16 | (x[4] >> 16 & 0xff) << 8 | (x[4] >> 24 & 0xff); 
    
        return Array(a, b, c, d, e);
    }
    /*
     * 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;
    }
    /*
     * Calculate the HMAC-SHA1 of a key and some data
     */
    function core_hmac_sha1(key, data) { 
        var bkey = str2binb(key); 
        if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz); 
        var ipad = Array(16),
              opad = Array(16); 
        for (var i = 0; i < 16; i++) {  
            ipad[i] = bkey[i] ^ 0x36363636;  
            opad[i] = bkey[i] ^ 0x5C5C5C5C; 
        } 
        var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz); 
        return core_sha1(opad.concat(hash), 512 + 160);
    }
    /*
     * Add integers, wrapping at 2^32. This uses 16-bit operations internally
     * to work around bugs in some JS interpreters.
     */
    function safe_add(x, y) { 
        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));
    }
    /*
     * Convert an 8-bit or 16-bit string to an array of big-endian words
     * In 8-bit function, characters >255 have their hi-byte silently ignored.
     */
    function str2binb(str) { 
        var bin = Array(); 
        var mask = (1 << chrsz) - 1for (var i = 0; i < str.length * chrsz; i += chrsz)  bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32); 
        return bin;
    }
    /*
     * Convert an array of big-endian words to a string
     */
    function binb2str(bin) { 
        var str = ""var mask = (1 << chrsz) - 1for (var i = 0; i < bin.length * 32; i += chrsz)  str += String.fromCharCode((bin[i >> 5] >>> (24 - i % 32)) & mask); 
        return str;
    }
    /*
     * Convert an array of big-endian words to a hex string.
     */
    function binb2hex(binarray) { 
        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"var str = ""for (var i = 0; i < binarray.length * 4; i++) {   str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);  } 
        return str;
    }
    /*
     * Convert an array of big-endian words to a base-64 string
     */
    function binb2b64(binarray) { 
        var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"var str = ""for (var i = 0; i < binarray.length * 4; i += 3) {  
            var triplet = (((binarray[i >> 2] >> 8 * (3 - i % 4)) & 0xFF) << 16) | (((binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4)) & 0xFF) << 8) | ((binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4)) & 0xFF);  
            for (var j = 0; j < 4; j++) {   
                if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;   
                else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);  
            } 
        } 
        return str;
    }
    getCommonParamMap: function() {
            var _self = this;
            var map = {};
            map.app_key = window.juli.ximalaya_app_key;
            map.device_id = window.juli.ximalaya_device_id;
            map.client_os_type = "3";
            map.access_token = _self.getAccessToken();
            console.log("getCommonParamMap");
            console.log(map);
        },
        getAccessToken: function() {
            var expireTime = localStorage.getItem(juli.ximalaya_expiresTimestamp);
            var currentTimeStamp = new Date().getTime();
            if (expireTime === '' || expireTime === null || expireTime < currentTimeStamp) {
                this.getXimalayaToken();
            }
            var token = localStorage.getItem(juli.ximalaya_tokenKey);
            if (token === '' || token === null) {
                //this.getXimalayaToken();
            }
    
            return localStorage.getItem(juli.ximalaya_tokenKey);
        },
        getXimalayaToken: function() {
            var _self = this;
            var url = "http://api.ximalaya.com/oauth2/secure_access_token?grant_type=client_credentials";
            var params = "&sig=30a6d709d0a2aa45efb9154203bc664f&device_id=123456&nonce=1234567890&client_id=458d1314d02ce72f070dc31e7cd83dde&timestamp=1516431468557";
            //url += params;
            var currentTimestamp = new Date().getTime();
            var map = {};
            map.client_id = juli.ximalaya_app_key;
            map.grant_type = "client_credentials";
            map.device_id = juli.ximalaya_device_id;
            map.nonce = this.getRandomString(10);
            map.timestamp = currentTimestamp;
            var sig = this.caculateSignature(juli.ximalaya_app_secret, map);
            console.log(sig + "-------");
            map.sig = sig;
            var xhr = null;
    
            if (window.XMLHttpRequest) {
                xhr = window.XMLHttpRequest;
            } else if (window.ActiveXObject('Microsoft.XMLHTTP')) {
                // I do not know if this works
                xhr = window.ActiveXObject('Microsoft.XMLHTTP');
            }
    
            var send = xhr.prototype.send;
            xhr.prototype.send = function(data) {
                try {
                    //TODO: comment the next line
                    console.log('pre send', data);
                    send.call(this, data);
                    //TODO: comment the next line
                    console.log('pos send');
                } catch (e) {
                    //TODO: comment the next line
                    console.log('err send', e);
                }
            };
            var xhr = new XMLHttpRequest();
            //设置xhr请求的超时时间
            xhr.timeout = 3000;
            //设置响应返回的数据格式
            xhr.responseType = "text";
            //创建一个 post 请求,采用异步
            xhr.open('POST', url, true);
            //注册相关事件回调处理函数
            xhr.onload = function(e) {
                if (this.status == 200 || this.status == 304) {
                    alert(this.responseText);
                }
            };
            xhr.send(params);
            try {
                $.ajax({
                        url: url,
                        type: 'POST',
                        async: false,
                        cache: false,
                        contentType: 'application/json',
                        dataType: 'json',
                        data: {
                            "sig": "30a6d709d0a2aa45efb9154203bc664f",
                            "device_id": "123456",
                            "nonce": "1234567890",
                            "client_id": "458d1314d02ce72f070dc31e7cd83dde",
                            "timestamp": "1516431468557"
                        } //_self.getParamAppendString(map)
                    })
                    .done(function(res) {
                        console.log("ximalaya token: " + res);
                        var obj = res.parseJSON();
                        console.log(obj.access_token);
                        console.log(obj.expires_in);
                    })
            } catch (e) {
                console.log(e);
            }
        },
        getRandomString: function(len) {
            len = len || 32;  
            var $chars = 'abcdefghijklmnopqrstuvwxyz0123456789';  
            var maxPos = $chars.length;  
            var pwd = '';  
            for (i = 0; i < len; i++) {     pwd += $chars.charAt(Math.floor(Math.random() * maxPos));   }  
            return pwd;
        },
        caculateSignature: function(seed, map) {
            var params = "";
            var list = [];
            for (var key in map) {
                list.push(key);
            }
            list.sort();
            for (key in list) {
                console.log("list: " + list[key] + " : " + map[list[key]]);
                params += list[key] + "=" + map[list[key]] + "&";
            }
            params = params.substring(0, params.length - 1);
            var paramsEncodeStr = base64encode(params);
            console.log("base64encode param: " + paramsEncodeStr);
            var sha1 = core_hmac_sha1(seed, paramsEncodeStr);
            var bytes = wordToByteArray(sha1);
            console.log("bytes: " + bytes);
            var spark = new SparkMD5.ArrayBuffer();
            spark.append(new Uint8Array(bytes));
            var sig = spark.end();
            return sig;
        },
        getParamAppendString: function(map) {
            var params = "";
            for (var key in map) {
                console.log(key + " : " + map[key]);
                var value = map[key];
                if (key == "q" || key == "tag_name") {
                    value = encodeURI(encodeURI(map[key]));
                }
                params += key + "=" + value + "&";
            }
            params = params.substring(0, params.length - 1);
            console.log(params);
            return params;
        }
  • 相关阅读:
    【USACO】接住苹果
    【题解】任务分配
    【伪·题解】高级打字机
    【noi openjudge题解】最低通行费
    【USACO】草地排水
    【POJ2186】受牛仰慕的牛
    【NOIP2011提高组】选择客栈
    [bzoj1026][SCOI2009]windy数 (数位dp)
    [bzoj1025][SCOI2009]游戏 (分组背包)
    [bzoj1024][SCOI2009]生日快乐 (枚举)
  • 原文地址:https://www.cnblogs.com/george-cw/p/8336206.html
Copyright © 2011-2022 走看看