一致的散列SHA1模运算

时间:2016-04-13 11:37:31

标签: c++ c bit-manipulation bitwise-operators consistent-hashing

我希望这里的一位大师可以帮助我

我正在编写一个C / C ++代码来实现使用SHA1作为散列算法的Consistent Hashing。

我需要实现模块操作如下:

0100 0011....0110 100 mod 0010 1001 = ?

如果除数(0000 1111)是2 pow(2,n)的幂,那么结果就是最后n位的被除数就很容易了。

SHA1长度为160位(或40 hexa)。我的问题是如何实现长位串的模运算到另一个任意位串?

谢谢。

1 个答案:

答案 0 :(得分:1)

用户 stark 在评论中指出(比我认为的更粗鲁),这只是基础2 ^ 32中的长划分。或者在基数2中,有更多数字。并且您可以将该算法用于您在学校学习的基础10的长分区。

有更好的算法可以在更大的数字上进行划分,但对于您的应用程序,我怀疑您可以非常简单且低效地执行此操作,沿着以下几行(这是基本2版本,这相当于减去关闭分母的左移版本,直到你不能再这样做了):

// Treat x,y as 160-bit numbers, where [0] is least significant and
// [4] is most significant. Compute x mod y, and put the result in out.
void mod160(unsigned int out[5], const unsigned int x[5], const unsigned y[5]) {
  unsigned int temp[5];
  copy160(out, x);
  copy160(temp, y);
  int n=0;
  // Find first 1-bit in quotient.
  while (lessthanhalf160(temp, x)) { lshift160(temp); ++n; }
  while (n>=0) {
    if (!less160(out, temp)) sub160(out, temp); // quotient bit is 1
    rshift160(temp); --n; // proceed to next bit of quotient
  }
}

为避免疑义,以上只是粗略的草图:

  • 可能充满了错误。
  • 我没有编写像less160这样的构建块函数的实现。
  • 实际上你可能只是为那些内联代码而不是单独的函数。例如,copy160只是五个作业,或一个短循环,或一个memcpy

肯定可以提高效率;例如,第一步可能更好地计算前导0位然后进行单次移位,而不是一次移动一个位置。 (右移可能不想这样做,因为有一半时间你只做一次换班。)

“base-2 ^ 32”版本可能会更快,但实现会更复杂。