Создание hash для файла



  • Собственно заморочился и не знаю какой метод лучше выбрать.
    собственно такой вариант работает

    var MD5 = function(d){var r = M(V(Y(X(d),8*d.length)));return r.toLowerCase()};function M(d){for(var _,m="0123456789ABCDEF",f="",r=0;r<d.length;r++)_=d.charCodeAt(r),f+=m.charAt(_>>>4&15)+m.charAt(15&_);return f}function X(d){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<<m%32;return _}function V(d){for(var _="",m=0;m<32*d.length;m+=8)_+=String.fromCharCode(d[m>>5]>>>m%32&255);return _}function Y(d,_){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n<d.length;n+=16){var h=m,t=f,g=r,e=i;f=md5_ii(f=md5_ii(f=md5_ii(f=md5_ii(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_ff(f=md5_ff(f=md5_ff(f=md5_ff(f,r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+0],7,-680876936),f,r,d[n+1],12,-389564586),m,f,d[n+2],17,606105819),i,m,d[n+3],22,-1044525330),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+4],7,-176418897),f,r,d[n+5],12,1200080426),m,f,d[n+6],17,-1473231341),i,m,d[n+7],22,-45705983),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+8],7,1770035416),f,r,d[n+9],12,-1958414417),m,f,d[n+10],17,-42063),i,m,d[n+11],22,-1990404162),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+12],7,1804603682),f,r,d[n+13],12,-40341101),m,f,d[n+14],17,-1502002290),i,m,d[n+15],22,1236535329),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+1],5,-165796510),f,r,d[n+6],9,-1069501632),m,f,d[n+11],14,643717713),i,m,d[n+0],20,-373897302),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+5],5,-701558691),f,r,d[n+10],9,38016083),m,f,d[n+15],14,-660478335),i,m,d[n+4],20,-405537848),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+9],5,568446438),f,r,d[n+14],9,-1019803690),m,f,d[n+3],14,-187363961),i,m,d[n+8],20,1163531501),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+13],5,-1444681467),f,r,d[n+2],9,-51403784),m,f,d[n+7],14,1735328473),i,m,d[n+12],20,-1926607734),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+5],4,-378558),f,r,d[n+8],11,-2022574463),m,f,d[n+11],16,1839030562),i,m,d[n+14],23,-35309556),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+1],4,-1530992060),f,r,d[n+4],11,1272893353),m,f,d[n+7],16,-155497632),i,m,d[n+10],23,-1094730640),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+13],4,681279174),f,r,d[n+0],11,-358537222),m,f,d[n+3],16,-722521979),i,m,d[n+6],23,76029189),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+9],4,-640364487),f,r,d[n+12],11,-421815835),m,f,d[n+15],16,530742520),i,m,d[n+2],23,-995338651),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+0],6,-198630844),f,r,d[n+7],10,1126891415),m,f,d[n+14],15,-1416354905),i,m,d[n+5],21,-57434055),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+12],6,1700485571),f,r,d[n+3],10,-1894986606),m,f,d[n+10],15,-1051523),i,m,d[n+1],21,-2054922799),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+8],6,1873313359),f,r,d[n+15],10,-30611744),m,f,d[n+6],15,-1560198380),i,m,d[n+13],21,1309151649),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+4],6,-145523070),f,r,d[n+11],10,-1120210379),m,f,d[n+2],15,718787259),i,m,d[n+9],21,-343485551),m=safe_add(m,h),f=safe_add(f,t),r=safe_add(r,g),i=safe_add(i,e)}return Array(m,f,r,i)}function md5_cmn(d,_,m,f,r,i){return safe_add(bit_rol(safe_add(safe_add(_,d),safe_add(f,i)),r),m)}function md5_ff(d,_,m,f,r,i,n){return md5_cmn(_&m|~_&f,d,_,r,i,n)}function md5_gg(d,_,m,f,r,i,n){return md5_cmn(_&f|m&~f,d,_,r,i,n)}function md5_hh(d,_,m,f,r,i,n){return md5_cmn(_^m^f,d,_,r,i,n)}function md5_ii(d,_,m,f,r,i,n){return md5_cmn(m^(_|~f),d,_,r,i,n)}function safe_add(d,_){var m=(65535&d)+(65535&_);return(d>>16)+(_>>16)+(m>>16)<<16|65535&m}function bit_rol(d,_){return d<<_|d>>>32-_}
    
    /** NORMAL words**/
    var value = [[MYFILE]];
    
    var result = MD5(value);
     
    VAR_HASH = result;
    

    Но тут еще почитал что мол быстрее всего и меньше столкновения тип можно использовать SubtleCrypto

    Кто чем пользуется и кто что посоветует ?



  • @Bigma модуль Checksum же есть, не подходит?



  • @Oyasumi-Punpun ты имеешь ввиду в ноде ?



  • @Bigma нет, для БАС модуль, или тебе обязательно через ноду надо?



  • нашел более надежный sha-256
    без использования ноды можно

    var sha256=function a(b){function c(a,b){return a>>>b|a<<32-b}for(var d,e,f=Math.pow,g=f(2,32),h="length",i="",j=[],k=8*b[h],l=a.h=a.h||[],m=a.k=a.k||[],n=m[h],o={},p=2;64>n;p++)if(!o[p]){for(d=0;313>d;d+=p)o[d]=p;l[n]=f(p,.5)*g|0,m[n++]=f(p,1/3)*g|0}for(b+="\x80";b[h]%64-56;)b+="\x00";for(d=0;d<b[h];d++){if(e=b.charCodeAt(d),e>>8)return;j[d>>2]|=e<<(3-d)%4*8}for(j[j[h]]=k/g|0,j[j[h]]=k,e=0;e<j[h];){var q=j.slice(e,e+=16),r=l;for(l=l.slice(0,8),d=0;64>d;d++){var s=q[d-15],t=q[d-2],u=l[0],v=l[4],w=l[7]+(c(v,6)^c(v,11)^c(v,25))+(v&l[5]^~v&l[6])+m[d]+(q[d]=16>d?q[d]:q[d-16]+(c(s,7)^c(s,18)^s>>>3)+q[d-7]+(c(t,17)^c(t,19)^t>>>10)|0),x=(c(u,2)^c(u,13)^c(u,22))+(u&l[1]^u&l[2]^l[1]&l[2]);l=[w+x|0].concat(l),l[4]=l[4]+w|0}for(d=0;8>d;d++)l[d]=l[d]+r[d]|0}for(d=0;8>d;d++)for(e=3;e+1;e--){var y=l[d]>>8*e&255;i+=(16>y?0:"")+y.toString(16)}return i};
    var resultik = sha256('hello world');
    VAR_HASH = resultik;
    

    может кому пригодится, но есть проблема подходит только для ASCII



  • @Oyasumi-Punpun чето не нашел для баса, это где ? ставить надо ?



  • @Bigma вроде в релизе уже есть давно, в менеджере модулей Checksum (Контрольная сумма), он вроде как отключен по умолчанию.



  • @Oyasumi-Punpun said in Создание hash для файла:
    да отключен, вот я и найти не мог, эх спасибо мил человек.
    А то я тут пол инете перешерстил но таки нашел :)
    может кому сгодится для sha256 с поддержкой utf8

    //https://codepen.io/aminraisy/pen/OeOvxr?editors=0010
    var Sha256={hash:function(r,a){(a=void 0===a||a)&&(r=Utf8.encode(r));for(var t=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],e=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],o=(r+=String.fromCharCode(128)).length/4+2,n=Math.ceil(o/16),h=new Array(n),u=0;u<n;u++){h[u]=new Array(16);for(var S=0;S<16;S++)h[u][S]=r.charCodeAt(64*u+4*S)<<24|r.charCodeAt(64*u+4*S+1)<<16|r.charCodeAt(64*u+4*S+2)<<8|r.charCodeAt(64*u+4*S+3)}h[n-1][14]=8*(r.length-1)/Math.pow(2,32),h[n-1][14]=Math.floor(h[n-1][14]),h[n-1][15]=8*(r.length-1)&4294967295;var f,c,i,C,d,R,g,v,A=new Array(64);for(u=0;u<n;u++){for(var m=0;m<16;m++)A[m]=h[u][m];for(m=16;m<64;m++)A[m]=Sha256.sigma1(A[m-2])+A[m-7]+Sha256.sigma0(A[m-15])+A[m-16]&4294967295;f=e[0],c=e[1],i=e[2],C=e[3],d=e[4],R=e[5],g=e[6],v=e[7];for(m=0;m<64;m++){var O=v+Sha256.Sigma1(d)+Sha256.Ch(d,R,g)+t[m]+A[m],T=Sha256.Sigma0(f)+Sha256.Maj(f,c,i);v=g,g=R,R=d,d=C+O&4294967295,C=i,i=c,c=f,f=O+T&4294967295}e[0]=e[0]+f&4294967295,e[1]=e[1]+c&4294967295,e[2]=e[2]+i&4294967295,e[3]=e[3]+C&4294967295,e[4]=e[4]+d&4294967295,e[5]=e[5]+R&4294967295,e[6]=e[6]+g&4294967295,e[7]=e[7]+v&4294967295}return Sha256.toHexStr(e[0])+Sha256.toHexStr(e[1])+Sha256.toHexStr(e[2])+Sha256.toHexStr(e[3])+Sha256.toHexStr(e[4])+Sha256.toHexStr(e[5])+Sha256.toHexStr(e[6])+Sha256.toHexStr(e[7])},ROTR:function(r,a){return a>>>r|a<<32-r},Sigma0:function(r){return Sha256.ROTR(2,r)^Sha256.ROTR(13,r)^Sha256.ROTR(22,r)},Sigma1:function(r){return Sha256.ROTR(6,r)^Sha256.ROTR(11,r)^Sha256.ROTR(25,r)},sigma0:function(r){return Sha256.ROTR(7,r)^Sha256.ROTR(18,r)^r>>>3},sigma1:function(r){return Sha256.ROTR(17,r)^Sha256.ROTR(19,r)^r>>>10},Ch:function(r,a,t){return r&a^~r&t},Maj:function(r,a,t){return r&a^r&t^a&t},toHexStr:function(r){for(var a="",t=7;t>=0;t--)a+=(r>>>4*t&15).toString(16);return a}},Utf8={encode:function(r){var a=r.replace(/[\u0080-\u07ff]/g,function(r){var a=r.charCodeAt(0);return String.fromCharCode(192|a>>6,128|63&a)});return a=a.replace(/[\u0800-\uffff]/g,function(r){var a=r.charCodeAt(0);return String.fromCharCode(224|a>>12,128|a>>6&63,128|63&a)})},decode:function(r){var a=r.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,function(r){var a=(15&r.charCodeAt(0))<<12|(63&r.charCodeAt(1))<<6|63&r.charCodeAt(2);return String.fromCharCode(a)});return a=a.replace(/[\u00c0-\u00df][\u0080-\u00bf]/g,function(r){var a=(31&r.charCodeAt(0))<<6|63&r.charCodeAt(1);return String.fromCharCode(a)})}};
    var value = [[MY_STRING]];
    VAR_HASH = Sha256.hash(value);
    

Log in to reply
 

  • 11
  • 2
  • 2
  • 3
  • 4
  • 9
  • 3
  • 3