Сначала следует преобразовать выходные данные хеш-функции в целое число без знака, а затем уменьшить его по модулю m . Это выглядит так:
MessageDigest md = MessageDigest.getInstance("MD5");
// hash data...
byte[] hashValue = md.digest();
BigInteger n = new BigInteger(1, hashValue);
n = n.mod(m);
// at that point, n has a value between 0 and m-1 (inclusive)
Я предположил, что m - это BigInteger
экземпляр. При необходимости используйте BigInteger.valueOf()
. Аналогично, используйте n.intValue()
или n.longValue()
, чтобы получить значение n в качестве одного из примитивных типов Java.
Модульное сокращение несколько смещено, но смещение очень мало, если m существенно меньше, чем 2 ^ 128 .