每Java文档中,哈希代码的String对象被计算为:
Run Code Online (Sandbox Code Playgroud)s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]使用
int算术,其中s[i]是 字符串的第i个字符,是字符串n的长度,并^指示取幂.
为什么31用作乘数?
我知道乘数应该是一个相对较大的素数.那么为什么不是29岁,37岁,甚至97岁?
我想为android中的字符串生成一个唯一的哈希码.是否有任何预定义库或我们必须手动生成.如果有任何正文,请提供链接或代码.
我有很多英文单词,我想哈希.什么是良好的散列函数?到目前为止,我的散列函数将字母的ASCII值相加,然后以表格大小为模.我正在寻找一些有效而简单的东西.
我有一个Unicode/UTF-16编码路径.路径分隔符是U + 005C'\'.路径是以空值终止的根相对Windows文件系统路径,例如"\ windows\system32\drivers\myDriver32.sys"
我想将此路径哈希为64位无符号整数.它并不需要是"加密的声音".散列应该不区分大小写,但能够处理非ascii字母.显然,哈希也应该散布好.
我有一些想法:
A)使用Windows文件标识符作为"哈希".在我的情况下,我确实希望在文件移动时更改哈希值,因此这不是一个选项.
B)只需使用常规的sting哈希:hash + = prime*hash + codepoint作为整个字符串.
我确实感觉可以利用路径由"segements"(文件夹名称和最终文件名)组成的事实.
总结需求:
1)64位散列
2)文件系统路径的良好分布/少碰撞.
3)高效
4)不需要安全
5)不区分大小写
我们被告知我们应该为我们的类实现hashCode(),但是像我这样的大多数人都不知道如何做到这一点,或者如果我们把它"弄错"会发生什么.例如,我需要一个哈希函数来索引树中的节点(在(解析)树的集合中查找最频繁的子树).在这种情况下,我需要基于有序的子节点递归地生成哈希码,例如
hashCode = function(child1.hashCode, child2.hashCode, ...)
Run Code Online (Sandbox Code Playgroud)
在最近的hashCodes 讨论中,答案包括字符串的散列(基于长素数和31)以及位移.String哈希是:
// adapted from String.hashCode()
public static long hash(String string) {
long h = 1125899906842597L; // prime
int len = string.length();
for (int i = 0; i < len; i++) {
h = 31*h + string.charAt(i);
}
return h;
}
Run Code Online (Sandbox Code Playgroud)
我对安全性不感兴趣,也不介意碰撞.是否存在一个"通用函数",用于组合有序对象的哈希码,它们会比损害更好(并且比完全不调用它更好)?
还有一个我们可以查找常见案例的网站吗?字符串,列表等)
我没有指定语言,因为我希望有通用的方法.但如果它是严格的语言,那么请说明语言以及为什么它不是普遍的.
更新两个建议是使用IDE的hashCode生成器.这似乎是一个很好的默认; 这是Netbeans:
public int hashCode() {
int hash = 5;
// objects
hash = 97 * hash + (this.rootElement != null ? this.rootElement.hashCode() : …Run Code Online (Sandbox Code Playgroud) 我需要字符串的 64 位整数哈希值,例如哈希映射。
在我看来,没有可以返回 64 位整数的原生 PHP 哈希功能?
我认为可以将 sha1 哈希的第一部分转换为整数。但是,这不会带来最佳性能,并且转换似乎很棘手。
当然,无需安装即可使用本机 PHP 函数会很好。
我正在寻找在 Java 中为给定字符串计算唯一哈希的方法。看起来我不能使用 MD5 或 SHA1,因为人们声称它们已损坏并且并不总是保证唯一性。
对于通过该equals()方法相等的两个 String 对象,我应该获得相同的哈希值(最好是 32 个字符的字符串,如 MD5 Sum)。并且没有其他 String 应该生成这个哈希 - 这是棘手的部分。
有没有办法在 Java 中实现这一点?