গণনা সিআরসি 32 হ্যাশ


14

ক্রেডিট

এই চ্যালেঞ্জটি @ মাইল থেকে উদ্ভূত হয়েছিল ।


একটি ফাংশন তৈরি করুন যা কোনও ইনপুট স্ট্রিংয়ের সিআরসি 32 হ্যাশ গণনা করে। ইনপুটটি কোনও দৈর্ঘ্যের একটি ASCII স্ট্রিং হবে। আউটপুটটি সেই ইনপুট স্ট্রিংয়ের সিআরসি 32 হ্যাশ হবে।

ব্যাখ্যা

সিআরসি 32 এবং অন্যান্য সিআরসি-এর অ্যালগরিদম মূলত একই, সুতরাং কেবল সিআরসি 3 এখানে প্রদর্শিত হবে।

প্রথমত, আপনার জেনারেটরের বহুপদী রয়েছে, যা আসলে একটি 4-বিট [এন + 1] পূর্ণসংখ্যা (সিআরসি 32 এ 33-বিট হবে)।

এই উদাহরণস্বরূপ, জেনারেটর বহুবচন হয় 1101

তারপরে, আপনার কাছে হ্যাশ করার স্ট্রিং থাকবে, যা এই উদাহরণে হবে 00010010111100101011001101

00010010111100101011001101|000 (1)    append three [n] "0"s
   1101                        (2)    align with highest bit
00001000111100101011001101|000 (3)    XOR (1) and (2)
    1101                       (4)    align with highest bit
00000101111100101011001101|000 (5)    XOR (3) and (4)
     1101                      (6)    align with highest bit
00000011011100101011001101|000 (7)    XOR (5) and (6)
      1101                     (8)    align with highest bit
00000000001100101011001101|000 (9)    XOR (7) and (8)
          1101                 (10)   align with highest bit
00000000000001101011001101|000 (11)   XOR (9) and (10)
             1101              (12)   align with highest bit
00000000000000000011001101|000 (13)   XOR (11) and (12)
                  1101         (14)   align with highest bit
00000000000000000000011101|000 (15)   XOR (13) and (14)
                     1101      (16)   align with highest bit
00000000000000000000000111|000 (17)   XOR (15) and (16)
                       110 1   (18)   align with highest bit
00000000000000000000000001|100 (19)   XOR (17) and (18)
                         1 101 (20)   align with highest bit
00000000000000000000000000|001 (21)   XOR (19) and (20)
^--------REGION 1--------^ ^2^

(21)অঞ্চল 1 যখন শূন্য হয় তখন প্রাপ্ত 001অবশিষ্ট অংশটি সিআরসি 3 হ্যাশের ফলাফল হবে।

চশমা

  • জেনারেটর বহুপদী হয় 0x104C11DB7, বা 0b100000100110000010001110110110111, বা 4374732215
  • ইনপুটটি স্ট্রিং বা পূর্ণসংখ্যার একটি তালিকা বা অন্য কোনও যুক্তিসঙ্গত বিন্যাস হতে পারে।
  • আউটপুট হেক্স স্ট্রিং বা কেবল একটি পূর্ণসংখ্যা বা অন্য কোনও যুক্তিসঙ্গত ফর্ম্যাট।
  • সিআরসি 32 হ্যাশ গণনা করে এমন বিল্ট-ইনগুলি অনুমোদিত নয়।

লক্ষ্য

জন্য স্ট্যান্ডার্ড বিধি প্রযোজ্য।

সংক্ষিপ্ততম কোডটি জয়ী।

পরীক্ষার মামলা

input         output      (hex)
"code-golf"   147743960   08CE64D8
"jelly"       1699969158  65537886
""            0           00000000

যদি আমি সঠিকভাবে বুঝতে পারি তবে এটি বহুমাত্রিক বিভাগ মডুলো 2 করছে এবং বাকীটি অনুসন্ধান করছে, অর্থাত্ XOR গুণায় মোডের এনালগ ।
xnor

1
হাঁ। এটি যদিও এক্সনোর মডুলো নয়, এটি হল জোর মডুলো।
ফাঁস নুন

সিআরসি 32 এর জন্য, আপনি কি প্রথমে 31 0 যুক্ত করেন?
xnor

হ্যাঁ - - - - - - - - -
লিকি নুন

1
@ কেনেনি লাউ আপনি চ্যাট করার মতোই লোকদের নাম দিয়ে পিং করতে পারেন।
আর

উত্তর:


12

ইন্টেল x86, 34 30 29 27 বাইট

ESI- এ শূন্য-সমাপ্ত স্ট্রিংয়ের ঠিকানা নেয় এবং সিবিসিটি EBX এ দেয়:

31 db ac c1 e0 18 74 01 31 c3 6a 08 59 01 db 73 
06 81 f3 b7 1d c1 04 e2 f4 eb e7

বিযুক্তি (এটি ও টি সিনট্যাক্স):

00000000    xorl    %ebx, %ebx
00000002    lodsb   (%esi), %al
00000003    shll    $24, %eax
00000006    je      0x9
00000008    xorl    %eax, %ebx
0000000a    pushl   $8
0000000c    popl    %ecx
0000000d    addl    %ebx, %ebx
0000000f    jae     0x17
00000011    xorl    $0x4c11db7, %ebx
00000017    loop    0xd
00000019    jmp     0x2
0000001b

আরও চারটি বাইট সংরক্ষণের জন্য পিটার কর্ডসের পরামর্শ অন্তর্ভুক্ত করা হয়েছে। এটি কলিং কনভেনশন গ্রহণ করে যেখানে স্ট্রিং নির্দেশাবলীর জন্য নির্দেশিকা পতাকা প্রবেশের সময় সাফ হয়ে যায়।

একটি বাইট সংরক্ষণ করে একটি ধ্রুবক লোড করতে ধাক্কা আক্ষরিক এবং পপ ব্যবহারের জন্য পিটার ফেরির পরামর্শ অন্তর্ভুক্ত।

মোট দুটি বাইট সংরক্ষণ করে দৈর্ঘ্যের পরিবর্তে শূন্য-সমাপ্ত স্ট্রিংয়ের রুটিনটির ইন্টারফেস পরিবর্তনের সাথে মিলিয়ে xorl %eax, %ebxএকটি retlনির্দেশের একটি নির্দেশের দ্বিতীয় বাইটে যাওয়ার জন্য পিটার ফেরির পরামর্শ অন্তর্ভুক্ত ।


একটি কলিং কনভেনশন ব্যবহার করুন যাতে প্রবেশের সময় দিকের পতাকাটি সাফ হওয়া দরকার, যাতে আপনি cldইনসনটি সংরক্ষণ করতে পারেন (যেমন আমি আমার অ্যাডলার 32 উত্তরটি দিয়েছিলাম )। এএসএম উত্তরের জন্য সম্পূর্ণ নির্বিচারে কলিং কনভেনশনের অনুমতি দেওয়া কি সাধারণ অভ্যাস?
পিটার কর্ডেস

যাইহোক, দেখে মনে হচ্ছে আপনার কোডটি x86-64 মেশিন কোড হিসাবে কাজ করবে এবং আপনি x86-64 SysV x32 কলিং কনভেনশনটি গণনা করতে ediএবং পয়েন্টারটি ব্যবহার করতে পারেন esi(সম্ভবত শূন্য-প্রসারিত নয়, তাই সম্ভবত জিনিসগুলিতে ঝাঁকুনির প্রয়োজন এবং একটি 64 বিট শূন্য-বর্ধিত পয়েন্টার)। (x32 যাতে আপনি নিরাপদে 32 বিট পয়েন্টার ম্যাথ ব্যবহার করতে পারেন তবে এখনও রেজিস্টার-আরোগুলি কলিং কনভেনশন রয়েছে Since আপনি যেহেতু ব্যবহার করেন না inc, লং মোডের কোনও খারাপ দিক নেই))
পিটার কর্ডেস

আপনি কি edxবাই-বিপরীত ক্রম রাখার বিষয়টি বিবেচনা করেছেন ? bswap edxমাত্র 2 বি। shr %edx2 বি, আপনার বাম-শিফটের সাথে সমান add %edx,%edx। এটি সম্ভবত সহায়ক নয়; এটি যদি আরও অপ্টিমাইজেশান সক্ষম না করে আপনি এর জন্য 3 বি সঞ্চয় করেন shl $24, %eaxতবে আপনি xor %eax,%eaxশুরুতে এবং bswap %edxশেষে 4B খরচ করেন। জিরোয়িং ইক্স cdqআপনাকে শূন্য করতে ব্যবহার করতে দেয় না %edx, তাই সামগ্রিকভাবে এটি ধোয়া। এটি আরও ভাল সঞ্চালন করবে, যদিও: এটি প্রতিটি পুনরাবৃত্তির উপর আংশিক-নিবন্ধের স্টল / মন্দা এড়াতে লেখার থেকে alএবং পরে eaxshl দিয়ে পড়া থেকে বিরত থাকে। : পি
পিটার কর্ডেস

1
অ্যাডলার -32 প্রশ্নের সাথে বিভ্রান্ত হয়ে পড়েছেন, যার দৈর্ঘ্য সীমা রয়েছে। এই প্রশ্নের স্পষ্ট দৈর্ঘ্যের সীমা নেই।
মার্ক অ্যাডলার

1
PCLMULQDQ নির্দেশের সাহায্যে এই সংক্ষিপ্ততর করার একটি উপায় থাকতে পারে। তবে এর ব্যবহারের জন্য প্রচুর ধ্রুবকের প্রয়োজন রয়েছে, সম্ভবত এটি নয়।
মার্ক অ্যাডলার


4

রুবি, 142 বাইট

বেনামে ফাংশন; ইনপুট হিসাবে একটি স্ট্রিং নেয়, একটি পূর্ণসংখ্যা ফেরত।

->s{z=8*i=s.size;r=0;h=4374732215<<z
l=->n{j=0;j+=1 while 0<n/=2;j}
s.bytes.map{|e|r+=e*256**(i-=1)};r<<=32
z.times{h/=2;r^=l[h]==l[r]?h:0}
r}

2
আপনি কি আমাদের নামটি পরিবর্তন করতে পারেন যাতে লোকেরা আমাদের আলাদা করতে পারে? এক্সডি
লিকি নুন

2
@ কেনি লাউ অবশ্যই আপনার পছন্দমতো হতে হবে ... ঠিক আছে
মান কালি

আমি সবেমাত্র xd ঠাট্টা করছিলাম
লিকি নুন

4

জেলি , 23 বাইট

ḅ⁹Bµ4374732215B×ḢḊ^µL¡Ḅ

সংখ্যার একটি তালিকা আকারে ইনপুট। এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

জেলি বিটওয়াইস এক্সওআর থাকাকালীন, জিরোগুলির সাথে ইনপুটটি প্যাডিং করে এবং সর্বাধিক উল্লেখযোগ্য বাইনারি সংখ্যার সাথে বহুভুজকে সারিবদ্ধ করে এই পদ্ধতিটি তৈরি করে, যা পরিবর্তে বিটের তালিকাগুলি ব্যবহার করে একটি ছোট খাটো।

ḅ⁹Bµ4374732215B×ḢḊ^µL¡Ḅ  Main link. Argument: A (list of bytes)

ḅ⁹                       Convert A from base 256 to integer.
  B                      Convert the result to binary, yielding a list.
   µ                     Begin a new, monadic chain. Argument: B (list of bits)
    4374732215B          Convert the integer to binary, yielding a list.
                Ḣ        Pop and yield the first, most significant bit of B.
               ×         Multiply each bit in the polynomial by the popped bit.
                 ^       Compute the element-wise XOR of both lists.
                         If one of the lists is shorter, the elements of the other
                         lists do not get modified, thus avoiding the necessity
                         of right-padding B with zeroes.
                  µ      Convert the previous chain into a link.
                   L¡    Execute the chain L times, where L is the number of bits
                         in the original bit list.
                     Ḅ   Convert from binary to integer.


3

সিজেম, 37 36 বাইট

q256b32m<{Yb4374732215Yb.^Yb_Yb32>}g

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

q               e# Read input.
256b            e# Convert to single number by treating the character codes
                e# as base-256 digits.
32m<            e# Left-shift the number by 32 bits, effectively appending 32
                e# zeros to the binary representation.
{               e# While the condition on top of the stack is truthy...
  Yb            e#   Convert the number to base 2.
  4374732215Yb  e#   Convert the polynomial to base 2.
  .^            e#   Take the bitwise XOR. If the number is longer than the
                e#   polynomial, the remaining bits will be left unchanged.
  Yb            e#   Convert the list back from base 2, effectively stripping
                e#   leading zeros for the next iteration.
  _             e#   Duplicate the result.
  Yb            e#   Convert back to base 2.
  32>           e#   Remove the first 32 bits. If any are left, continue the loop.
}g

q256bYb_,{(4374732215Ybf*1>.^}*Ybকয়েক বাইট সাশ্রয়।
ডেনিস

@ ডেনিস এটি সত্যই চালাক, এটিকে পৃথক উত্তর হিসাবে নির্দ্বিধায় বলুন। :)
মার্টিন এন্ডার

3

পাইথ, 28 বাইট

uhS+GmxG.<C"Á·"dlhG.<Cz32

অনলাইনে চেষ্টা করুন: বিক্ষোভ বা পরীক্ষার স্যুট

ব্যাখ্যা:

uhS+GmxG.<C"..."dlhG.<Cz32   implicit: z = input string
                      Cz     convert to number
                    .<  32   shift it by 32 bits
u                            apply the following expression to G = ^,
                             until it get stuck in a loop:
     m           lhG            map each d in range(0, log2(G+1)) to:
          C"..."                   convert this string to a number (4374732215)
        .<      d                  shift it by d bits
      xG                           xor with G
   +G                           add G to this list
 hS                             take the minimum as new G

2

জাভাস্ক্রিপ্ট (ES6), 180 বাইট

f=(s,t=(s+`\0\0\0\0`).replace(/[^]/g,(c,i)=>(c.charCodeAt()+256*!!i).toString(2).slice(!!i)))=>t[32]?f(s,t.replace(/.(.{32})/,(_,m)=>(('0b'+m^79764919)>>>0).toString(2))):+('0b'+t)

৩৩-বিট এক্সওআর অপারেটর বা এমনকি স্বাক্ষরবিহীন ৩২-বিট এক্সওআর অপারেটরের অভাব বিরক্তিকর।


1

সিজেম, 33 বাইট

q256bYb_,{(4374732215Ybf*1>.^}*Yb

ইনপুট একটি স্ট্রিং আকারে। এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

q                                  Read all input from STDIN.
 256bYb                            Convert it from base 256 to base 2.
       _,{                   }*    Compute the length and repeat that many times:
          (                          Shift out the first bit.
           4374732215Yb              Convert the integer to base 2.
                       f*            Multiply each bit by the shifted out bit.
                         1>          Remove the first bit.
                           .^        Compute the element-wise XOR of both lists.
                                     If one of the lists is shorter, the elements
                                     of the other lists do not get modified, thus
                                     avoiding the necessity of right-padding B with
                                     zeroes.
                               Yb  Convert the final result from base 2 to integer.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.