Сопоставьте слова с отдельными символами - PullRequest
3 голосов
/ 06 августа 2020

Я создаю функцию ha sh, которая должна отображать любую строку (максимальная длина 100 символов) в один символ [AZ] (я использую его для целей сегментирования).

Я пришел с помощью этой простой функции Java, есть ли способ сделать это быстрее?

public static final char stringToChar(final String s) {
    long counter = 0;
    for (char c : s.toCharArray()) {
        counter += c;
    }
    return (char)('A'+(counter%26));
}

1 Ответ

6 голосов
/ 06 августа 2020

Быстрый трюк для равномерного распределения «осколков» - это использование функции ha sh.

Я предлагаю этот метод, который использует функцию java String.hashCode() по умолчанию

public static char getShardLabel(String string) {
    int hash = string.hashCode();
    // using Math.flootMod instead of operator % beacause '%' can produce negavive outputs
    int hashMod = Math.floorMod(hash, 26);
    return (char)('A'+(hashMod));
}

Как указано здесь , этот метод считается «даже достаточно».

На основе быстрого теста он выглядит быстрее, чем предложенное вами решение. На строках 80kk различной длины:

  • getShardLabel заняло 65 миллисекунд
  • stringToChar заняло 571 миллисекунду
...