#java #memory #encoding #hash #cassandra
#java #память #кодирование #хэш #cassandra
Вопрос:
Я пытаюсь понять последствия использования хэша MD5 в качестве ключа Cassandra с точки зрения «потребления памяти / хранилища»:
- Хэш MD5 моего содержимого (на Java) = байт [] имеет длину 16 байт. (16 байт взяты из википедии для общего md5, я не уверен, что реализации Java также возвращают 16 байт)
- Шестнадцатеричное кодирование этого значения, чтобы иметь возможность распечатать его в удобочитаемом формате => 1 байт становится значением 2hex
- Я должен представлять каждое шестнадцатеричное значение как «символ» в java => результат = «два строковых символьных значения» (например, «FF» — это строка длиной / размером = 2.)
- Java использует UTF-16 => поэтому каждый «строковый символ» кодируется двумя байтами. Для «FF» потребуется 2×2 байта?
- Заключение => Хэш MD5 в формате Bytes равен 16 байтам, но представленный в виде строки java hex utf16, занимает 16x2x2 = 64 байта (в памяти) !?!? Правильно ли это?
Каково потребление памяти в Cassandra, использующей это в качестве ключа строки?
Если бы я напрямую использовал массив байтов из хэш-функции, я бы предположил, что он потребляет 16 байт в Cassandra?
Но если я использую представление в виде шестнадцатеричной строки (как указано выше), может ли cassandra «сжать» его до 16 байтов или оно также займет 64 байта в cassandra? Я предполагаю, что 64 байта в Cassandra, это правильно?
Какие ключи вы используете? Используете ли вы вывод хэш-функции напрямую или сначала кодируете в шестнадцатеричную строку, а затем используете строку? (В MySQL я всегда, когда бы я ни использовал хэш-ключ, я использовал представление в виде шестнадцатеричной строки it…So оно непосредственно читается в инструментах MySQL и во всем приложении. Но теперь я понимаю, что это тратит впустую память ???)
Возможно, мое мышление совершенно неверно, тогда было бы любезно объяснить, где я ошибаюсь.
Это очень много! йенс
Ответ №1:
Правильно по обоим пунктам: байт [] будет равен 16 байтам, utf16 в шестнадцатеричном формате будет равен 64.
В версии 0.8 у Cassandra есть метаданные ключа, поэтому вы можете указать ему «этот ключ является байтом []», и он будет отображаться в шестнадцатеричном формате в командной строке.