【问题标题】:SHA1 hexdigest to longSHA1 hexdigest 到 long
【发布时间】:2012-07-29 11:45:57
【问题描述】:

我有这个 Python 代码(hexdigest 是 SHA1):

d = long(hexdigest, 16)
if d >> 159:
    return "-%x" % ((-d) & (2**160-1))
return "%x" % d

我需要将此代码翻译成 D。我尝试了几件事:

  • to!long(hexdigest, 16) - 溢出失败(对于 ulong 来说太大)
  • std.BigInt 不支持二进制 &

你会如何在 D 中做到这一点?我将此问题也标记为 C 相关,因为 C 解决方案也适用于 D。

【问题讨论】:

    标签: c d bigint


    【解决方案1】:

    因此,您需要从无符号到有符号 2 的补码的十六进制到十六进制转换。您是否意识到您可以逐个数字地进行?输入字符串中的每个数字加上输出字符串中的对应数字等于0xf,除了最后一个数字,它是0x10。对于这个问题,任何类型的 bigint 算法都是多余的。

    C 中的演示(注意:这不会去除前导零)

    #include <stdio.h>
    #include <string.h>
    
    static int fromhex(char dig)
    {
      return dig >= '0' && dig <= '9' ? dig - '0'      :
             dig >= 'A' && dig <= 'F' ? dig - 'A' + 10 :
             dig >= 'a' && dig <= 'f' ? dig - 'a' + 10 :
             -1;
    }
    
    int main(int argc, char **argv)
    {
      if(argc!=2 ||
         strlen(argv[1])!=40 ||
         strspn(argv[1], "0123456789abcdefABCDEF")!=40)
      {
        fprintf(stderr, "Usage: %s sha1hex\n", argv[0]);
        return 1;
      }
      if(strchr("01234567", argv[1][0])) {
        puts(argv[1]);
      } else {
        int i;
        putchar('-');
        for(i=0;i<39;++i)
          printf("%x", 15 - fromhex(argv[1][i]));
        printf("%x\n", 16 - fromhex(argv[1][i]));
      }
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      此代码看起来像一个 NOP。您正在解析一个 SHA1 hexdigest,它是一个 20 字节的数字。它永远不会超过 160 位,因此 d&gt;&gt;160 始终为 0。然后您只需以相同格式重新格式化十六进制摘要。我猜你正在删除前导零,如果有的话。

      我很惊讶 D 的 std.BigInt 不提供位操作 (&amp;,|,^)。自己写?没那么难。

      【讨论】:

      • 对不起,我的错实际上是d &gt;&gt; 159,我已经解决了。问题是,我不知道如何实现二进制操作,而且我对 BigInt 的结构并不坚定,这需要一些时间,而我没有。
      • 嗯,这个条件相当于hexdigest[0]89ABCDEFabcdef 之一。您可以通过执行d - ((d &gt;&gt; 160) &lt;&lt; 160) 获得&amp;(在否定它之后?)。
      • 无论如何,这很愚蠢。修复下游代码以接受无符号数字并忘记此代码。
      • 这是针对客户端的,服务器只接受这种愚蠢的哈希格式。我会在上面尝试您的解决方案。到目前为止,谢谢。
      猜你喜欢
      • 2017-08-16
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多