试图将哈希函数转换为C

时间:2015-02-25 15:36:34

标签: c hash

我看到了这个哈希函数并希望将其转换为C.遇到.substring和toCharArray()的问题

long sfold(String s, int M) 
{
   int intLength = s.length() / 4;
   long sum = 0;
   for (int j = 0; j < intLength; j++) 
   {
      char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();
      long mult = 1;
      for (int k = 0; k < c.length; k++) 
      {
         sum += c[k] * mult;
         mult *= 256;
      }
   }

   char c[] = s.substring(intLength * 4).toCharArray();
   long mult = 1;
   for (int k = 0; k < c.length; k++) 
   {
      sum += c[k] * mult;
      mult *= 256;
   }

   return(Math.abs(sum) % M);
}

我做了以下更改:

long sfold(char* s, int M) 
{
   int intLength = strlen(s) / 4;
   long sum = 0;
   for (int j = 0; j < intLength; j++) 
   {
      char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();
      long mult = 1;
      for (int k = 0; k < strlen(c); k++) 
      {
         sum += c[k] * mult;
         mult *= 256;
      }
   }

   char c[] = s.substring(intLength * 4).toCharArray();
   long mult = 1;
   for (int k = 0; k < strlen(c); k++) 
   {
      sum += c[k] * mult;
      mult *= 256;
   }

   return(Math.abs(sum) % M);
}

这两条线我遇到了麻烦:

char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();
char c[] = s.substring(intLength * 4).toCharArray();

可以解释这两条线在做什么吗?

1 个答案:

答案 0 :(得分:2)

第一个是每次向一个数组读取四个字符的块:

char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();

您可以将其替换为:

char c[4];
memcpy(c, s + 4*j, 4);

第二个是复制字符串的其余部分,从小于strlen(s)的最大倍数复制到结尾,因为:

int intLength = strlen(s) / 4;

因此:

char c[] = s.substring(intLength * 4).toCharArray();

只是:

char c[strlen(s)];
memcpy(c, s + intLength*4, strlen(s) - 4*intLength);

此时,您应该预先计算strlen(s)并将其存储在变量中,因为C中的字符串实际上不存在(它们只是char的数组,其最后一个元素是\0 )并且每次调用strlen都意味着必须扫描整个字符串\0,以确定长度。

但是,所有这些副本都不是必需的,因为您没有修改s ,因此您只需调整循环中的索引,就可以跳过{{1总而言之:

memcpy