jon*_*sdf 151
通常哈希不会做算术,否则stop和pots将具有相同的哈希值.
并且你不会将它限制在前n个字符,因为否则房屋和房屋将具有相同的哈希值.
通常,散列取值并乘以素数(使其更有可能生成唯一的散列)所以你可以这样做:
int hash = 7;
for (int i = 0; i < strlen; i++) {
hash = hash*31 + charAt(i);
}
Run Code Online (Sandbox Code Playgroud)
小智 133
如果它是一个安全的东西,你可以使用Java加密:
import java.security.MessageDigest;
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(stringToEncrypt.getBytes());
String encryptedString = new String(messageDigest.digest());
Run Code Online (Sandbox Code Playgroud)
Fre*_*rik 37
您应该使用String.hashCode().
如果你真的想自己实现hashCode:
不要试图从哈希码计算中排除对象的重要部分以提高性能 - Joshua Bloch,Effective Java
仅使用前五个字符是个坏主意.想想层次名称,如URL:他们都将有相同的散列码(因为他们都开始以"http://",这意味着它们被存储在一个哈希表一样斗下,表现出可怕的性能.
这是一篇关于来自" Effective Java " 的String hashCode的战争故事:
在1.2之前的所有版本中实现的String散列函数检查最多16个字符,在整个字符串中均匀分布,从第一个字符开始.对于大型分层名称集合(例如URL),此哈希函数显示可怕的行为.
Pyr*_*cal 17
如果你用Java做这个,那么你为什么要这样做呢?只需调用.hashCode()字符串即可
Nick提供的这个函数很好但是如果你使用新的String(byte [] bytes)来转换为String,它就失败了.您可以使用此功能来执行此操作.
private static final char[] hex = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static String byteArray2Hex(byte[] bytes) {
StringBuffer sb = new StringBuffer(bytes.length * 2);
for(final byte b : bytes) {
sb.append(hex[(b & 0xF0) >> 4]);
sb.append(hex[b & 0x0F]);
}
return sb.toString();
}
public static String getStringFromSHA256(String stringToEncrypt) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(stringToEncrypt.getBytes());
return byteArray2Hex(messageDigest.digest());
}
Run Code Online (Sandbox Code Playgroud)
可能这可以帮助别人
// djb2 hash function
unsigned long hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
332970 次 |
| 最近记录: |