public static int HammingDistance(BitArray hash1, BitArray hash2) { if (hash1.Length != hash2.Length) { throw new ArgumentException("Can't compare hashes with different length"); } var d = 0; var bits = hash1.Xor(hash2); for (var i = 0; i < bits.Length; i++) { d += bits[i] ? 1 : 0; } return(d); }
public static byte[] ToHashBytes(this BitArray bits) { var length = (bits.Length - 1) / 8 + 1; byte[] result = new byte[length]; for (var i = 0; i < result.Length; i++) { var index = i * 8; result[i] = (byte)( (bits[index + 0] ? 0b10000000 : 0b0) | (bits[index + 1] ? 0b1000000 : 0b0) | (bits[index + 2] ? 0b100000 : 0b0) | (bits[index + 3] ? 0b10000 : 0b0) | (bits[index + 4] ? 0b1000 : 0b0) | (bits[index + 5] ? 0b100 : 0b0) | (bits[index + 6] ? 0b10 : 0b0) | (bits[index + 7] ? 0b1 : 0b0)); } return(result); }
public static string ToHashString(this BitArray bits) { var length = (bits.Length - 1) / 8 + 1; var result = new System.Text.StringBuilder(length * 2); for (var i = 0; i < length; i++) { var index = i * 8; result.AppendFormat("{0:x2}", (byte)( (bits[index + 0] ? 0b10000000 : 0b0) | (bits[index + 1] ? 0b1000000 : 0b0) | (bits[index + 2] ? 0b100000 : 0b0) | (bits[index + 3] ? 0b10000 : 0b0) | (bits[index + 4] ? 0b1000 : 0b0) | (bits[index + 5] ? 0b100 : 0b0) | (bits[index + 6] ? 0b10 : 0b0) | (bits[index + 7] ? 0b1 : 0b0))); } return(result.ToString()); }