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

jen*_*ens 5 java memory hash encoding cassandra

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

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

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

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

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

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

也许我的想法是完全错误的,那么解释我错在哪里会很友好.

非常多!延

jbe*_*lis 2

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

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