【问题标题】:Cassandra = Memory/Encoding-Footprint of Keys (Hash/Bytes[]=>Hex=>UTF16=>Bytes[])Cassandra = 内存/编码-键的足迹 (Hash/Bytes[]=>Hex=>UTF16=>Bytes[])
【发布时间】:2011-05-13 13:23:58
【问题描述】:

我试图了解使用 MD5 哈希作为 Cassandra 密钥的含义,就“内存/存储消耗”而言:

  1. 我的内容的 MD5 哈希(在 Java 中)= byte[] 长度为 16 个字节。 (16 个字节来自通用 md5 的维基百科,如果 java 实现也返回 16 个字节,我不放心)
  2. 对这个值进行十六进制编码,以便能够以人类可读的格式打印它 => 1byte 变成 2hex 值
  3. 我必须将每个十六进制值表示为 java 中的“字符” => result=“两个字符串字符值”(例如“FF”是长度/大小 = 2 的字符串。)
  4. Java 使用 UTF-16 => 所以每个“字符串字符”都用两个字节编码。 “FF”需要 2x2 字节?
  5. 结论 => 字节格式的 MD5 哈希为 16 个字节,但表示为 java hex utf16 字符串消耗 16x2x2 = 64Bytes(在内存中)!?!?这是正确的吗?

Cassandra 中的存储消耗是多少,将其用作行键?

如果我直接使用 Hash 函数中的字节数组,我会假设它在 Cassandra 中消耗 16 个字节?

但是如果我使用十六进制字符串表示(如上所述),cassandra 可以将其“压缩”到 16 个字节,还是在 cassandra 中也需要 64 个字节?我假设 Cassandra 中有 64 个字节,这是正确的吗?

你使用什么样的钥匙?您是直接使用哈希函数的输出,还是先编码为十六进制字符串然后使用该字符串? (在 MySQL 中,每当我使用哈希键时,我总是使用它的十六进制字符串表示......所以它在 MySQL 工具和整个应用程序中是直接可读的。但我现在意识到它浪费存储空间?? ?)

也许我的想法完全不正确,那么请解释一下我错在哪里。

非常感谢! 詹斯

【问题讨论】:

    标签: java memory encoding hash cassandra


    【解决方案1】:

    两个计数都正确:byte[] 为 16 个字节,utf16-as-hex 为 64。

    在 0.8 中,Cassandra 具有密钥元数据,因此您可以告诉它“此密钥是一个字节 []”,它将在 cli 中以十六进制显示。

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 2022-08-17
      • 2018-12-23
      • 2013-09-01
      • 1970-01-01
      • 2019-09-09
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多