在C中转换三个uint32_t以生成唯一键的更快方法

我有三个uint32_t,当它们组合在一起时,它们将生成一个唯一的密钥。我必须这样做大约 100M 或更多,并且可能每天数次并将其存储在键值数据库中。我想保持尽可能少的字节数。我正在按以下方式进行操作,但我很好奇是否有更快的方法来做到这一点。

char *key = xmalloc(snprintf(NULL, 0, "%" PRIu32 "-%" PRIu32 "-%" PRIu32,num1,num2,num3) + 1);   
sprintf(key, "%" PRIu32 "-%" PRIu32 "-%" PRIu32, num1,num2,num3);

回答

  • 转换为十进制表示相当昂贵。如果使用十六进制,您可以获得更快的转换:

      sprintf(key, "%" PRIx32 "-%" PRIx32 "-%" PRIx32, num1, num2, num3);
    
  • 正如@AKX 提到的,使用固定大小的缓冲区。由于字符串(大概)已复制到数据库中,因此您不必担心它在数据库中占用的空间超出了所需空间:

      char key[32];
      snprintf(key, sizeof(key), "%" PRIx32 "-%" PRIx32 "-%" PRIx32, num1, num2, num3);
    

    数据库引擎不知道您过度分配了缓冲区。它将根据字符串的实际长度而不是缓冲区的大小分配自己的内存。

  • 实现您自己的十六进制格式。snprintf需要解析它的格式字符串并在运行时根据参数列表解释它。对于像您这样的任务,这具有不可忽视的开销。相反,您可以进行int32专门用于您的任务的自己的- 到十六进制转换。我会使用"abcdefghijklmnop"数字而不是传统的"0123456789abcdef".

  • 您的键值数据库是否需要文本编码的键?如果没有,您可以尝试为您的密钥使用二进制编码(例如,查看SQLite4 varint 编码以获得灵感)。


以上是在C中转换三个uint32_t以生成唯一键的更快方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>