gpt4 book ai didi

java - 如何在 Java 中生成共享相同哈希码的字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:03:46 26 4
gpt4 key购买 nike

现有的用 Java 编写的系统使用字符串的哈希码作为其负载平衡的路由策略。

现在,我无法修改系统,但需要生成共享相同哈希码的字符串来测试最坏情况。

我从命令行提供这些字符串,并希望系统将所有这些字符串路由到同一目的地。

是否可以生成大量共享相同哈希码的字符串?

为了弄清楚这个问题:

String[] getStringsInSameHashCode(int number){
//return an array in length "number"
//Every element of the array share the same hashcode.
//The element should be different from each other
}

备注:任何hashCode值都是可以接受的。对字符串是什么没有限制。但它们应该彼此不同。

编辑:String 类的覆盖方法是 Not Acceptable ,因为我从命令行输入这些字符串。

仪表化也是 Not Acceptable ,因为这会对系统产生一些影响。

最佳答案

看一个测试方法,基本上,只要你匹配,a1*31+b1 = a2*31 +b2,即(a1-a2)*31=b2-b1

public void testHash()
{
System.out.println("A:" + ((int)'A'));
System.out.println("B:" + ((int)'B'));
System.out.println("a:" + ((int)'a'));

System.out.println(hash("Aa".hashCode()));
System.out.println(hash("BB".hashCode()));
System.out.println(hash("Aa".hashCode()));
System.out.println(hash("BB".hashCode()));


System.out.println(hash("AaAa".hashCode()));
System.out.println(hash("BBBB".hashCode()));
System.out.println(hash("AaBB".hashCode()));
System.out.println(hash("BBAa".hashCode()));

}

你会得到

A:65
B:66
a:97
2260
2260
2260
2260
2019172
2019172
2019172
2019172

编辑:有人说这不够直接。我添加了以下部分

    @Test
public void testN() throws Exception {
List<String> l = HashCUtil.generateN(3);
for(int i = 0; i < l.size(); ++i){
System.out.println(l.get(i) + "---" + l.get(i).hashCode());
}
}
AaAaAa---1952508096
AaAaBB---1952508096
AaBBAa---1952508096
AaBBBB---1952508096
BBAaAa---1952508096
BBAaBB---1952508096
BBBBAa---1952508096
BBBBBB---1952508096

下面是源代码,它可能效率不高,但它可以工作:

public class HashCUtil {

private static String[] base = new String[] {"Aa", "BB"};

public static List<String> generateN(int n)
{
if(n <= 0)
{
return null;
}

List<String> list = generateOne(null);
for(int i = 1; i < n; ++i)
{
list = generateOne(list);
}

return list;
}


public static List<String> generateOne(List<String> strList)
{
if((null == strList) || (0 == strList.size()))
{
strList = new ArrayList<String>();
for(int i = 0; i < base.length; ++i)
{
strList.add(base[i]);
}

return strList;
}

List<String> result = new ArrayList<String>();

for(int i = 0; i < base.length; ++i)
{
for(String str: strList)
{
result.add(base[i] + str);
}
}

return result;
}
}

看String.hashCode()

   public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

关于java - 如何在 Java 中生成共享相同哈希码的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com