Сравните две хэшированные строки и распределите их по элементам в Java - PullRequest
0 голосов
/ 13 мая 2019

Я хэширую с некоторыми строками (идентификаторами) SHA-1 и сравниваю их с другими хешированными (также с SHA-1) строками (которые относятся к элементам), и я хочу распределить идентификаторы среди элементы. Я хочу распространить их с заявлением (hashedId

метод SHA-1

public static String simpleHashFunc(String a) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] messageDigest = md.digest(a.getBytes());
            BigInteger no = new BigInteger(1, messageDigest);

            String hashtext = no.toString(16);

            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }

            return hashtext;

        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

Испытательные линии

 int counter1 = 0, counter2 = 0, counter3 = 0, counter4 =0;
        for (int i = 0; i < topics.size(); i++) {
            String tempHash = Broker.simpleHashFunc(topics.get(i).getBusLine().getBuslineId());
            if (tempHash.compareTo(hashedBrokers.get(0)) == -1) {
                counter1++;
                //Distribution to element1
            } else if (tempHash.compareTo(hashedBrokers.get(1)) == -1) {
                counter2++;
                //Distribution to element2
            } else if (tempHash.compareTo(hashedBrokers.get(2)) == -1) {
                counter3++;
                //Distribution to element3
            } else {
                System.out.println("Cant go to broker: " + topics.get(i).getBusLine().getBuslineId());
                counter4++;
            }
        }
        System.out.println(counter1 + "  " + counter2 + "  " + counter3 + "  " + counter4);
//The majority of IDs go to to else { } and the counter4 has the greatest number.

Ожидаемые результаты:

Из 37ID: от 20 до элемента1, от 10 до элемента2, от 7 до элемента3

Ожидаемые результаты:

Из 37ID: от 25 до элемента1, от 10 до элемента2, от 2 до элемента3 ....

Фактические результаты:

Из 37 идентификаторов: 5 для элемента1, 10 для элемента2, 2 для элемента3, 20 идентификаторов не могут перейти к элементу

1 Ответ

1 голос
/ 16 мая 2019

Мы можем перейти к оператору else, а затем сделать это с самого начала с помощью функции mod ids% elements.size (). Мод может быть 0,1,2. Мы используем класс BigInteger для точности

//hashing buslineIDs and distributing to correct Brokers
            int counter1 = 0, counter2 = 0, counter3 = 0, counter4 = 0;
            for (int i = 0; i < topics.size(); i++) {
                String tempHash = Broker.simpleHashFunc(topics.get(i).getBusLine().getBuslineId());
                if (tempHash.compareTo(hashedBrokers.get(0)) == -1) {
                    counter1++;
                    //add responsibility line
                } else if (tempHash.compareTo(hashedBrokers.get(1)) == -1) {
                    counter2++;
                } else if (tempHash.compareTo(hashedBrokers.get(2)) == -1) {
                    counter3++;
                } else {
                    counter4++;
                    BigInteger tempHashBig = new BigInteger(tempHash, 32);
                    //System.out.println(tempHashBig);
                    if (tempHashBig.mod(BigInteger.valueOf(hashedBrokers.size())).equals(BigInteger.valueOf(0))) {
                        counter1++;
                    } else if (tempHashBig.mod(BigInteger.valueOf(hashedBrokers.size())).equals(BigInteger.valueOf(1))) {
                        counter2++;
                    } else if (tempHashBig.mod(BigInteger.valueOf(hashedBrokers.size())).equals(BigInteger.valueOf(2))) {
                        counter3++;
                    }

                }


            }
...