Monday, May 13, 2024
 Popular · Latest · Hot · Upcoming
9
rated 0 times [  13] [ 4]  / answers: 1 / hits: 27111  / 15 Years ago, fri, may 1, 2009, 12:00:00

I need a quick checksum (as fast as possilbe) for small strings (20-500 chars).



I need the source code and that must be small! (about 100 LOC max)



If it could generate strings in Base32/64. (or something similar) it would be perfect. Basically the checksums cannot use any bad chars.. you know.. the usual (){}[].,;:/+-| etc



Clarifications



It could be strong/weak, that really doesn't matter since it is only for behind-the-scenes purposes.



It need not contain all the data of the original string since I will be only doing comparison with generated checksums, I don't expect any sort of decryption.


More From » string

 Answers
40

Quick implementation in C, no copyrights from my side, so use it as you wish. But please note that this is a very weak checksum, so don't use it for serious things :) - but that's what you wanted, isn't it?



This returns an 32-bit integer checksum encoded as an string containing its hex value.
If the checksum function doesn't satisfy your needs, you can change the chk += ((int)(str[i]) * (i + 1)); line to something better (f.e. multiplication, addition and bitwise rotating would be much better).



EDIT: Following hughdbrown's advice and one of the answers he linked, I changed the for loop so it doesn't call strlen with every iteration.



#include <stdio.h>
#include <stdlib.h>
#include <string>

char* hextab = 0123456789ABCDEF;

char* encode_int(int i) {
char* c = (char*)malloc(sizeof(char) * 9);

for (int j = 0; j < 4; j++) {
c[(j << 1)] = hextab[((i % 256) >> 4)];
c[(j << 1) + 1] = hextab[((i % 256) % 16)];

i = (i >> 8);
}
c[8] = 0;

return c;
}

int checksum(char* str) {
int i;
int chk = 0x12345678;

for (i = 0; str[i] != ''; i++) {
chk += ((int)(str[i]) * (i + 1));
}

return chk;
}

int main() {
char* str1 = Teststring;
char* str2 = Teststring2;

printf(string: %s, checksum string: %sn, str1, encode_int(checksum(str1)));
printf(string: %s, checksum string: %sn, str2, encode_int(checksum(str2)));

return 0;
}

[#99616] Saturday, April 25, 2009, 15 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
rey

Total Points: 415
Total Questions: 100
Total Answers: 100

Location: Croatia
Member since Fri, Sep 11, 2020
4 Years ago
;