c - 尝试将哈希函数转换为 C

标签 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();

有人能解释一下这两行在做什么吗?

最佳答案

第一个是每次读取四个字符的 block 到一个数组:

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

您可以将其替换为:

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

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

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,所以您只需调整循环中的索引,您可以跳过memcpy 一共:

long sfold(const char* s, size_t length, long M) {
   size_t intLength = length / 4;

   long sum = 0;

   for (size_t j = 0; j < intLength; j++) {
      long mult = 1;
      for (int k = 0; k < 4; k++) {
         sum += s[j*4 + k] * mult;
         mult *= 256;
      }
   }

   long mult = 1;
   for (size_t k = intLength*4; k < length; k++) {
      sum += s[k] * mult;
      mult *= 256;
   }

   return labs(sum) % M;
}

关于c - 尝试将哈希函数转换为 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28723090/

相关文章:

c++ - 通过套接字发送整数数组时出现问题

c - C 中的运行时错误

java - 如何使用 MessageDigest , Base64 解码

c++ - unordered_map 的用户定义哈希函数

java - 可变对象的 hashCode() 是否有用?

c - 奇怪的 printf/pthread 错误?

c - 枚举周围的方括号是什么意思? [枚举值]

将文本文件转换为 CSV 文件的 C 程序

java - 将数组存储在 Set 中并避免重复

objective-c - 核心数据数据库中的 iOS 密码哈希数据类型?