3
我想在z3中表示一個哈希函數,類似於SHA(x)。在做了一些研究之後,看起來z3並不支持注入性,所以我不能有這樣的約束(並且雖然我認識到這並非嚴格地說是因爲碰撞而是真的,作爲一種啓發式方法,它對我的項目)z3不支持注入的解決方法
forall([x, y],Implies(SHA(x)==SHA(y), x==y))
並期望解算器終止。
我的問題是,是否有任何已知的最佳實踐解決這個問題的解決方法?例如,如果我爲每對x和y添加Implies(SHA(x)== SHA(y),x == y)約束而不使用量詞,這是否可以解決問題?
使用部分逆我仍然有使用Implies(f(x)== f(y),x == y)的樸素方法的問題,即求解器無法找到解決方案簡單的問題。 例如: '進口Z3 一個= z3.BitVec( '一個',32) B = z3.BitVec( 'B',32) X = z3.BitVec( 'X',32) 散列= z3.Function('hash',z3.BitVecSort(32),z3.BitVecSort(32)) hash_inv = z3.Function('hash',z3.BitVecSort(32),z3.BitVecSort(32)) hash_pred = z3.ForAll([x],hash_inv(hash(x))== x) s = z3.Solver() z3.set_param(verbose = 10)s.add(hash_pred) s.add(hash a)!= hash(b)) s.add(a!= b) s.check()' – dirtyfilthy