আপনার যদি প্রয়োজন হয় "sub-10-character hash"
আপনি ফ্লেচার -32 এলগোরিদম ব্যবহার করতে পারেন যা 8 টি অক্ষর হ্যাশ (32 বিট), সিআরসি -32 বা অ্যাডলার -32 তৈরি করে ।
সিআরসি -32 অ্যাডলার 32 এর চেয়ে 20% - 100% এর একটি ফ্যাক্টর দ্বারা ধীর।
ফ্ল্যাচার -32 অ্যাডলার -32 এর চেয়ে কিছুটা বেশি নির্ভরযোগ্য। অ্যাডলার চেকসামের তুলনায় এটির কম কম্পিউটেশনাল ব্যয় রয়েছে: ফ্ল্যাচার বনাম অ্যাডলারের তুলনায় ।
কয়েকটি ফ্লেচার বাস্তবায়ন সহ একটি নমুনা প্রোগ্রাম নীচে দেওয়া হয়েছে:
#include <stdio.h>
#include <string.h>
#include <stdint.h> // for uint32_t
uint32_t fletcher32_1(const uint16_t *data, size_t len)
{
uint32_t c0, c1;
unsigned int i;
for (c0 = c1 = 0; len >= 360; len -= 360) {
for (i = 0; i < 360; ++i) {
c0 = c0 + *data++;
c1 = c1 + c0;
}
c0 = c0 % 65535;
c1 = c1 % 65535;
}
for (i = 0; i < len; ++i) {
c0 = c0 + *data++;
c1 = c1 + c0;
}
c0 = c0 % 65535;
c1 = c1 % 65535;
return (c1 << 16 | c0);
}
uint32_t fletcher32_2(const uint16_t *data, size_t l)
{
uint32_t sum1 = 0xffff, sum2 = 0xffff;
while (l) {
unsigned tlen = l > 359 ? 359 : l;
l -= tlen;
do {
sum2 += sum1 += *data++;
} while (--tlen);
sum1 = (sum1 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
}
sum1 = (sum1 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
return (sum2 << 16) | sum1;
}
int main()
{
char *str1 = "abcde";
char *str2 = "abcdef";
size_t len1 = (strlen(str1)+1) / 2;
size_t len2 = (strlen(str2)+1) / 2;
uint32_t f1 = fletcher32_1(str1, len1);
uint32_t f2 = fletcher32_2(str1, len1);
printf("%u %X \n", f1,f1);
printf("%u %X \n\n", f2,f2);
f1 = fletcher32_1(str2, len2);
f2 = fletcher32_2(str2, len2);
printf("%u %X \n",f1,f1);
printf("%u %X \n",f2,f2);
return 0;
}
আউটপুট:
4031760169 F04FC729
4031760169 F04FC729
1448095018 56502D2A
1448095018 56502D2A
টেস্ট ভেক্টরগুলির সাথে একমত :
"abcde" -> 4031760169 (0xF04FC729)
"abcdef" -> 1448095018 (0x56502D2A)
অ্যাডলার -32 এর কয়েক শতাধিক বাইট সহ সংক্ষিপ্ত বার্তাগুলির জন্য দুর্বলতা রয়েছে, কারণ এই বার্তাগুলির চেকসামগুলিতে 32 টি উপলব্ধ বিটের কম কভারেজ রয়েছে। এটা যাচাই কর:
তুলনামূলক চেকসামের সাথে প্রতিযোগিতা করার জন্য অ্যাডলার 32 অ্যালগরিদম যথেষ্ট জটিল নয় ।