将单词映射到单个字符

fai*_*can 3 java hash performance

我正在构建一个哈希函数,它应该将任何字符串(最大长度 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));
}
Run Code Online (Sandbox Code Playgroud)

Pad*_*ado 6

均匀分布“碎片”的一个快速技巧是使用哈希函数。

我建议这种使用默认javaString.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));
}
Run Code Online (Sandbox Code Playgroud)

正如这里所指出的,这种方法被认为“甚至足够”。

根据快速测试,它看起来比您建议的解决方案更快。
在各种长度的 80kk 弦上:

  • getShardLabel 花了 65 毫秒
  • stringToChar 耗时 571 毫秒