import unittest import strutils include bloom from random import rand, randomize suite "murmur": # Test murmurhash3 implementations setup: var hashOutputs: MurmurHashes hashOutputs = [0, 0] rawMurmurHash128("hello", 5, 0'u32, hashOutputs) test "murmur128 raw": check int(hashOutputs[0]) == -3758069500696749310 check int(hashOutputs[1]) == 6565844092913065241 test "murmur128 wrapped": let hashOutputs2 = murmurHash128("hello", 0'u32) check hashOutputs2[0] == hashOutputs[0] check hashOutputs2[1] == hashOutputs[1] test "murmur32": let hash1 = murmurHash32("hello", 0'u32) let hash2 = murmurHash32("hello", 0'u32) check hash1 == hash2 # Same input should give same output let hash3 = murmurHash32("hello", 10'u32) check hash1 != hash3 # Different seeds should give different outputs suite "hash quality": test "hash type selection": let bfMurmur128 = initializeBloomFilter(100, 0.01, hashType = htMurmur128) let bfMurmur32 = initializeBloomFilter(100, 0.01, hashType = htMurmur32) let bfNimHash = initializeBloomFilter(100, 0.01, hashType = htNimHash) check bfMurmur128.hashType == htMurmur128 check bfMurmur32.hashType == htMurmur32 check bfNimHash.hashType == htNimHash test "quality across hash types": const testSize = 10_000 let patterns = @[ "shortstr", repeat("a", 1000), # Very long string "special@#$%^&*()", # Special characters "unicode→★∑≈", # Unicode characters repeat("pattern", 10) # Repeating pattern ] for hashType in [htMurmur128, htMurmur32, htNimHash]: var bf = initializeBloomFilter(testSize, 0.01, hashType = hashType) var inserted = newSeq[string](testSize) # Test pattern handling for pattern in patterns: bf.insert(pattern) check bf.lookup(pattern) # Test general insertion and lookup for i in 0..