应用KISS原则:
- SHA 只是一个字符串
- 的 JDK 哈希码
String
“足够随机”
Integer
可以在任何基础上渲染
这行代码就可以做到:
public static String shortHash(String sha) {
return Integer.toString(sha.hashCode() & 0x7FFFFFFF, 36).substring(0, 3);
}
注意:& 0x7FFFFFFF
符号位为零(哈希码可以是负数,否则会以负号开头)。
编辑 - 保证哈希长度
我最初的解决方案是幼稚的——它没有处理int
哈希小于100
(base 36)的情况——这意味着它会打印少于 3 个字符。此代码修复了该问题,同时仍保持值“随机”。它还避免了substring()
调用,因此性能应该更好。
static int min = Integer.parseInt("100", 36);
static int range = Integer.parseInt("zzz", 36) - min;
public static String shortHash(String sha) {
return Integer.toString(min + (sha.hashCode() & 0x7FFFFFFF) % range, 36);
}
100
此代码通过强制它介于和之间来保证最终哈希具有 3 个字符zzz
- 以 36 为基数的最低和最高 3 字符哈希,同时仍使其“随机”。