Cassandra =内存/编码 - 密钥的足迹(哈希/字节[] =>十六进制=> UTF16 =>字节[])

时间:2011-05-13 13:23:59

标签: java memory encoding hash cassandra

我试图理解在“内存/存储消耗”方面使用MD5 Hash作为Cassandra Key的含义:

  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 Hash in Bytes格式是16个字节,但表示为java hex utf16字符串消耗16x2x2 = 64Bytes(在内存中)!?!?这是对的吗?
  6. Cassandra的存储消耗是多少,将其用作行键?

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

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

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

    也许我的想法完全不正确,那么解释我错在哪里会很友善。

    非常好吃! 延

1 个答案:

答案 0 :(得分:2)

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

在0.8中,Cassandra有关键元数据,所以你可以告诉它“这个键是一个字节[]”,它将在cli中以十六进制显示。

相关问题