Oh, that is interesting. Correct - hash functions are great at that, but it depends on what you put in them to start with...
This is how it is described in the white paper:
For (mastenode in masternodes)
{
n = masternode.CalculateScore();
if (n > best_score) {
best_score = n;
winning_node = masternode;
}
}
CMasterNode::CalculateScore()
{
n1 = GetProofOfWorkHash(nBlockHeight);/ get the hash of this block
n2 = x11(n1);/ hash the POW hash to increase the entropy
n3 = abs(n2 - masternode_vin);
return n3;
}
Look at this line:
n3 = abs(n2 - masternode_vin);
This is simple subtraction, it means that nodes with similar hashes will be selected together while nodes with too different hashes will never be selected together. The better way would be just to hash n2 & masternode_vin, i.e.
n3 = hash(n2, masternode_vin);
This way at each new block selected nodes will be completely random.
As I said the actual algorithm used in DarkCoin is more complicated and probably more secure, still there is no reason to not simply use usual hash instead.