package io.pcp.parfait.dxm; import java.util.Set; public class HashingIdentifierSource implements IdentifierSource { private final int allowedIdentifierCount; public HashingIdentifierSource(int allowedIdentifierCount) { this.allowedIdentifierCount = allowedIdentifierCount; } @Override public int calculateId(String name, Set<Integer> usedIds) { if (usedIds.size() == this.allowedIdentifierCount) { throw new IllegalStateException("All identifiers in use; cannot assign another"); } int value = name.hashCode(); // Math.abs(MIN_VALUE) == MIN_VALUE, better deal with that just in case... if (value == Integer.MIN_VALUE) { value = 0; } value = Math.abs(value) % allowedIdentifierCount; while (usedIds.contains(value)) { value++; if (value == allowedIdentifierCount) { value = 0; } } return value; } }