Cassandra = Память / Кодирование-количество ключей (хэш / байты []=> Шестнадцатеричное значение => UTF16=> Байты[])

#java #memory #encoding #hash #cassandra

#java #память #кодирование #хэш #cassandra

Вопрос:

Я пытаюсь понять последствия использования хэша MD5 в качестве ключа Cassandra с точки зрения «потребления памяти / хранилища»:

  1. Хэш MD5 моего содержимого (на Java) = байт [] имеет длину 16 байт. (16 байт взяты из википедии для общего md5, я не уверен, что реализации Java также возвращают 16 байт)
  2. Шестнадцатеричное кодирование этого значения, чтобы иметь возможность распечатать его в удобочитаемом формате => 1 байт становится значением 2hex
  3. Я должен представлять каждое шестнадцатеричное значение как «символ» в java => результат = «два строковых символьных значения» (например, «FF» — это строка длиной / размером = 2.)
  4. Java использует UTF-16 => поэтому каждый «строковый символ» кодируется двумя байтами. Для «FF» потребуется 2×2 байта?
  5. Заключение => Хэш 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 есть метаданные ключа, поэтому вы можете указать ему «этот ключ является байтом []», и он будет отображаться в шестнадцатеричном формате в командной строке.