java - Cassandra = 内存/编码- key 占用空间(哈希/字节[]=>十六进制=>UTF16=>字节[])

标签 java memory encoding hash cassandra

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

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

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

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

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

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

也许我的想法完全不正确,那么请指出我错在哪里。

非常感谢! 延斯

最佳答案

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

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

关于java - Cassandra = 内存/编码- key 占用空间(哈希/字节[]=>十六进制=>UTF16=>字节[]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5992545/

相关文章:

java - CQRS 中不同聚合之间的交互

java - Apache poi如何获取单元格坐标

java - Mockito verify(...) 失败 - "Actually, there were zero interactions with this mock."在多次连续测试中运行

Python多线程内存占用高的问题

c# - 如何在 C# 中获取内存 MS Windows 7 的当前页面大小?

javascript - 下载文件时设置csv编码

mysql - 如何使sql以自定义编码返回数据集?

java - 保持用户登录 - 使用网络驱动程序保存 cookie

ios - CIContext、iOS 9 和内存问题

java - 使用java从Oracle数据库创建带有unicode字符的文件夹