Java ArrayList需要一个好的哈希函数<;整数>;
我有一个ArrayList,ArrayList是1-100之间不同的数字组合,现在需要将其更改为Hashmap中使用的键 然后我首先将ArrayList转换为字符串,然后使用哈希函数获取一个数字作为键。但是它看起来很慢,我可以跳过第一步(翻译步骤),在doHash函数中使用整数吗?或者有其他方法来改进它吗?谢谢Java ArrayList需要一个好的哈希函数<;整数>;,java,hash,arraylist,Java,Hash,Arraylist,我有一个ArrayList,ArrayList是1-100之间不同的数字组合,现在需要将其更改为Hashmap中使用的键 然后我首先将ArrayList转换为字符串,然后使用哈希函数获取一个数字作为键。但是它看起来很慢,我可以跳过第一步(翻译步骤),在doHash函数中使用整数吗?或者有其他方法来改进它吗?谢谢 public static String Arraytostr(ArrayList<Integer> route) { String listString
public static String Arraytostr(ArrayList<Integer> route) {
String listString = "";
for (Integer s : route){
listString += s;
}
return listString;
}
static long doHash(String str) {
long hash = 5381;
for (int i = 0; i < str.length(); i++) {
hash = ((hash << 5) + hash) + str.charAt(i);
}
return hash;
}
公共静态字符串Arraytostr(ArrayList路由){
字符串listString=“”;
对于(整数s:路由){
listString+=s;
}
返回listString;
}
静态长doHash(字符串str){
长散列=5381;
对于(int i=0;i hash=((hash我假设您编写自己的hash而不是使用hashCode
的原因是为了得到long
,而不是int
。如果int
足够,我强烈建议只使用ArrayList
上的hashCode
方法
将整数
s转换为字符串
s,然后逐个字符地将它们分开似乎有点奇怪。但您可以只执行以下操作,这将跳过所有昂贵的整数
到字符串的转换
static long doHash(Collection<Integer> inputs) {
long hash = 5381;
for (Integer i : inputs) {
hash = ((hash << 5) + hash) + i;
}
return hash;
}
静态长doHash(集合输入){
长散列=5381;
用于(整数i:输入){
hash=((hash您想要hashCode吗?为什么不使用由AbstractList
定义的ArrayList#hashCode()
?您不能使用Java内置的hash功能吗?.hashCode()比您可能编写的任何内容都要高效。或者只返回数组中的第一个值。或者返回前N个值的总和。您当前的has函数是否太慢,以至于无法满足您的性能要求?