SHA-1 হ্যাশ অ্যালগরিদম বাস্তবায়ন করা হচ্ছে


15

এই কোড-গল্ফের লক্ষ্য হ'ল একটি প্রোগ্রাম তৈরি করা যা স্ট্রিংটিকে ইনপুট হিসাবে গ্রহণ করে এবং আপনাকে SHA-1 হ্যাশ মানটি হেক্সাডেসিমাল সংখ্যা হিসাবে আউটপুট করতে হয়। আপনি এখানে SHA-1 এর সিউডোকোডটি পেতে পারেন

অন্যান্য নিয়ম:

  1. কোনও নেটওয়ার্ক অ্যাক্সেস নেই
  2. আপনাকে বাহ্যিক প্রোগ্রাম চালানোর অনুমতি নেই
  3. ইনপুট হ্যাশ করার জন্য আপনাকে বিল্ট-ইন পদ্ধতিগুলি ব্যবহার করার অনুমতি নেই
  4. সংক্ষিপ্ততম কোডটি জয়ী
  5. এটি কেবলমাত্র ASCII ইনপুট হ্যান্ডেল করা প্রয়োজন
  6. আউটপুট হয় ছোট হাতের বা বড় হাতের হতে পারে
  7. ইনপুটটি ব্যবহার করে সরবরাহ করা যেতে পারে:

    1. ইনপুট জন্য প্রম্পটিং
    2. কমান্ড-লাইন আর্গুমেন্ট ব্যবহার করে
    3. STDIN ব্যবহার করে

পরীক্ষার কেস:

Input: The quick brown fox jumps over the lazy dog
Output: 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
----------------------------------------------------------
Input: The quick brown fox jumps right over the lazy dog
Output: 1c3aff41d97ada6a25ae62f9522e4abd358d741f
------------------------------------------------------------
Input: This is a code golf challenge
Output: f52ff9edd95d98e707bd16a7dead459cb8db8693

উত্তর:


5

GolfScript, 374 322 অক্ষরের

[128]+.,.~55+64%1,*\(8*2
32?:?.*+256{base}:B~1>++"!Vi9y BRQ+@phoKD5Vj=]30z0"{96@32-*+}*?B\64/{4/{256B}%{0'=820'{64-
2$=^}/2*.?/+?%+}64*1$'&4$?(^3$&|1518500249{++[]@+@+@?*4/.?/+?%+2$+\@32*.?/++@(@+?%@-1%+}:Y~
^2$^1859775393Y
&4$3$&|3$3$&|2400959708Y
^2$^3395469782Y'n/{'~3$3$'\+20*~}/+]zip{~+?%}%}/{?+16B{.9>7*+48+}%1>}%''+

এটি গল্ফস্ক্রিপ্টে সিউডো কোডের সঠিক প্রয়োগের পাশাপাশি কোডটি ছোট করার জন্য কিছু ছোটখাটো এনকোডিংয়ের ভিত্তিতে তৈরি হয়েছে (এটি অনলাইনে চেষ্টা করুন )। এসটিডিআইএন থেকে ইনপুট পড়া হবে।


এটি আমি দেখা সবচেয়ে দীর্ঘতম গল্ফস্ক্রিপ্ট: পি
ডোরকনব

5

পাইথন 3 - 645 অক্ষর

h=0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,0xC3D2E1F0
L=lambda v,s:(v<<s|v>>B-s)%2**B
B=32
R=range
m=input().encode()
l=len(m)
m+=b'\x80'+bytes((55-l)%64)+m.fromhex(hex(2**64+l*8)[3:])
for C in [m[i:i+64]for i in R(0,len(m),64)]:
 w=[sum(C[i+j]<<8*(3-j)for j in R(4))for i in R(0,64,4)];a,b,c,d,e=h
 for i in R(16,80):w+=[L(w[i-3]^w[i-8]^w[i-14]^w[i-16],1)]
 for i in R(80):f=[b&c|~b&d,b^c^d,b&c|b&d|c&d,b^c^d][i//20];k=[0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6][i//20];t=L(a,5)+f+e+k+w[i];e=d;d=c;c=L(b,30);b=a;a=t%2**32
 g=a,b,c,d,e;h=[(h[i]+g[i])%2**32for i in R(5)]
B=160
print('%x'%(L(h[0],128)|L(h[1],96)|L(h[2],64)|L(h[3],32)|h[4]))

সিউডোকোডের কেবল একটি গল্ফ সংস্করণ।


পাইথন 3 এ ইউটিএফ = ইউ 8 করে?
আপনি

1
@ হ্যাঁ, এটিও কার্যকর works আমি সন্ধান করেছি এবং এটি দেখা গেছে যে .encode()ইউটিএফ -8 ডিফল্টরূপে ব্যবহার করে, যা আরও ছোট।
grc

2

ডি (759 অক্ষর)

অনলাইন নির্বাহযোগ্য সংস্করণ: http://dpaste.dzfl.pl/f0c8508f

import std.range,std.algorithm,std.bitmanip,std.stdio:g=writef;
void main(char[][]x){
    auto m=cast(ubyte[])x[1];
    uint a=0x67452301,b=0xEFCDAB89,i,t,f,k;
    uint[5]h=[a,b,~a,~b,0xC3D2E1F0],s;
    uint[80]w;
    auto r=(uint u,uint b)=>u<<b|u>>32-b;
    auto u=(uint i)=>[r(s[0],5)+f+s[4]+k+w[i],s[0],r(s[1],30),s[2],s[3]];
    ubyte[64]p;
    p[0]=128;
    m~=p[0..64-(m.length+8)%64]~nativeToBigEndian(8*m.length);
    foreach(ch;m.chunks(64)){
        16.iota.map!(i=>w[i]=ch[i*4..$][0..4].bigEndianToNative!uint).array;
        iota(16,80).map!(i=>w[i]=r(w[i-3]^w[i-8]^w[i-14]^w[i-16],1)).array;
        s=h;
        80.iota.map!(i=>(i<20?f=s[3]^s[1]&(s[2]^s[3]),k=0x5A827999:i<40?f=s[1]^s[2]^s[3],k=0x6ED9EBA1:i<60?f=s[1]&s[2]|s[3]&(s[1]|s[2]),k=0x8F1BBCDC:(f=s[1]^s[2]^s[3],k=0xCA62C1D6),s[]=u(i)[])).array;
        h[]+=s[];
    }
    g("%(%08x%)",h);
}

2

সি, 546 টি অক্ষর

প্রোগ্রামটি তার স্ট্যান্ডার্ড ইনপুটটির সামগ্রীগুলির SHA-1 গণনা করে।

unsigned b[16],k[]={1732584193,0xEFCDAB89,0,271733878,0xC3D2E1F0},i,j,n,p,t,u,v,w,x;
char*d=b;a(c){for(d[p++^3]=c,c=0,t=*k,u=k[1],v=k[2],w=k[3],x=k[4];
c>79?*k+=t,k[1]+=u,k[2]+=v,k[3]+=w,k[4]+=x,p=0:p>63;x=w,w=v,v=u<<30|u/4,u=t,t=i)
i=b[c-3&15]^b[c+8&15]^b[c+2&15]^b[j=c&15],c++>15?b[j]=i*2|i>>31:0,i=u^v^w,
i=(t<<5|t>>27)+x+b[j]+(c<21?(w^u&(v^w))+1518500249:c<41?i+1859775393:
c<61?(u&v|w&(u|v))-1894007588:i-899497514);}
main(){for(k[2]=~*k;i=~getchar();++n)a(~i);for(a(128);p-56;a(0));
for(;p<20?printf("%02x",(d=k)[p^3]&255):p>55;a(n*8L>>504-p*8));}

কয়েকটি নোট:

  1. এই প্রোগ্রামটি intঠিক 32 বিট হিসাবে ধরে নিয়েছে । প্ল্যাটফর্মগুলির ক্ষেত্রে যেখানে এটি হয় না, unsignedএকেবারে শুরুতে ঘোষণাটি প্ল্যাটফর্মের স্বাক্ষরযুক্ত 32-বিট টাইপ দ্বারা প্রতিস্থাপন করা উচিত। ( uint32_tএটি সুস্পষ্ট পছন্দ হবে, যদি এটির প্রয়োজন না হয়#include <stdint.h> ))
  2. এই প্রোগ্রামটি একটি সামান্য এন্ডিয়ান প্ল্যাটফর্ম ধরে নিয়েছে। একটি বিগ-এন্ডিয়ান প্ল্যাটফর্মের জন্য, ^3প্রোগ্রামের দুটি উপস্থিতি কেবল সরিয়ে ফেলুন এবং k[]নীচের ব্লকটির সূচনাটি প্রতিস্থাপন করুন :{19088743,0x89ABCDEF,0,1985229328,0xF0E1D2C3} ৫৪১ টি অক্ষরের আকারের জন্য।
  3. charডিফল্টরূপে স্বাক্ষরবিহীন এমন বাস্তবায়নের জন্য , &255আরও চারটি অক্ষর সংরক্ষণের জন্য চূড়ান্ত লাইনে উপস্থিত উপস্থিতি মুছতে পারে।

এটির be417768b5c3c5c1d9bcb2e7c119196dd76b5570জন্য ফিরে আসে The quick brown fox jumps over the lazy dogতবে এটি ফিরতে হবে2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
প্রোগ্রামফক্স

@ প্রোগ্রামগ্রামফক্স যে হ্যাশ মানটি স্ট্রিং প্লাস একটি সমাপ্ত নতুন লাইনের জন্য। বর্ণনায় উদ্ধৃত পরীক্ষার SHA-1 মানগুলি নিউলাইনগুলি বন্ধ না করে স্ট্রিংগুলির জন্য, সুতরাং যদি আপনি এই স্ট্রিংগুলি পরীক্ষা করতে চান তবে ইনপুটটিতে একটি নতুন লাইন যুক্ত করবেন না।
ব্রেডবক্স

1

আমার অজগর কোডটি আরও দীর্ঘ তবে এটি পুরোপুরি কাজ করছে।

data="hello world"
bytes = ""
h0,h1,h2,h3,h4=0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,0xC3D2E1F0
for n in range(len(data)):bytes+='{0:08b}'.format(ord(data[n]))
bits=bytes+"1"
pBits=bits
while len(pBits)%512!=448:pBits+="0"
pBits+='{0:064b}'.format(len(bits)-1)
def chunks(l,n):return[l[i:i+n]for i in range(0,len(l),n)]
def rol(n,b):return((n<<b)|(n>>(32-b)))&0xffffffff 
for c in chunks(pBits,4512):
    words=chunks(c,32)
    w=[0]*80
    for n in range(0,16):w[n]=int(words[n],2)
    for i in range(16,80):w[i]=rol((w[i-3]^w[i-8]^w[i-14]^w[i-16]),1)
    a,b,c,d,e=h0,h1,h2,h3,h4
    for i in range(0,80):
        if 0<=i<=19:f=(b&c)|((~b)&d);k=0x5A827999
        elif 20<=i<=39:f=b^c^d;k=0x6ED9EBA1
        elif 40<=i<=59:f=(b&c)|(b&d)|(c&d);k=0x8F1BBCDC
        elif 60<=i<=79:f=b^c^d;k=0xCA62C1D6
        temp=rol(a,5)+f+e+k+w[i]&0xffffffff
        e,d,c,b,a=d,c,rol(b,30),a,temp 
    h0+=a
    h1+=b
    h2+=c
    h3+=d
    h4+=e 
print '%08x%08x%08x%08x%08x'%(h0,h1,h2,h3,h4)

উত্তরে ভাষাটি নির্দিষ্ট করুন। এছাড়াও, যেহেতু এটি কোড-গল্ফ, আপনার কমপক্ষে মিনিফিকেশন চেষ্টা করা উচিত। এক-চর ভেরিয়েবলের নাম, অযৌক্তিক সাদা স্থান সরিয়ে, ব্যয়বহুল কনস্ট্যান্টগুলি ( 0xffffffff) ভেরিয়েবলগুলিতে স্ট্যাশ করে (এছাড়াও -1যথেষ্ট হবে?) ...
জন

আমার কাছে ফাইথনের মতো দেখাচ্ছে :)
ওয়েস কুরেশি

@ জনডভোরাক আমি আমার কোডটি পরিবর্তন করেছি।
কাইল কে

h0..h4এখনও দ্বি-অক্ষর ;-)
জন ডিভোরাক

আমি 29 লাইনটিতে একটি বাক্য গঠন ত্রুটি পেয়েছি
প্রোগ্রামফক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.