Untuk fungsi hash kriptografi modern, tidak, tidak ada predikat kedekatan yang dapat dihitung secara efisien, dengan asumsi distribusi aktif xmemiliki entropi yang cukup. Intinya adalah bahwa fungsi hash ini dirancang untuk "tidak memiliki struktur", sehingga mereka tidak mengakui hal seperti ini.
Dalam istilah teknis, fungsi hash kriptografi modern berperilaku "seperti oracle acak". Untuk oracle acak, tidak ada predikat kedekatan seperti itu: yang terbaik yang dapat Anda lakukan adalah membalikkan fungsi hash dan kemudian menghitung semua string dekat dan hash mereka. Akibatnya, tidak ada cara untuk melakukan ini untuk fungsi hash kriptografi modern.
Secara heuristik, memang memungkinkan untuk merancang fungsi hash khusus yang mengakui predikat kedekatan yang efisien, dan yang (kira-kira) "seaman mungkin" mengingat fakta ini. Mari kita asumsikan string yang akan kita hash memiliki panjang yang tetap. Misalkan kita memiliki kode koreksi kesalahan yang baik, dan biarkanD menjadi algoritma decoding (sehingga memetakan bit-string ke codeword terdekat, jika bisa).
Untuk mendapatkan skema yang sederhana namun tidak sempurna, bayangkan mendefinisikan h(x)=SHA256(D(x)). Jikax,y adalah dua string acak yang cukup dekat, maka ada kemungkinan yang layak h(x)=h(y). Jikax,y tidak dekat, kalau begitu h(x) tidak akan terlihat seperti h(y), dan kami tidak akan mendapatkan informasi di luar fakta itu x,ytidak dekat. Ini sederhana. Namun, itu juga tidak sempurna. Ada banyak pasanganx,y yang dekat tetapi dari mana kita tidak dapat mendeteksi fakta ini h(x),h(y) (misalnya, karena fungsi decoding D gagal).
Secara heuristik, tampak mungkin untuk meningkatkan konstruksi ini. Pada waktu desain, pilih bit-string acakr1,…,rk. Sekarang, tentukan fungsi hash berikut:
h(x)=(SHA256(D(x⊕r1),…,SHA256(D(x⊕rk)).
Sekarang jika x,y cukup dekat, kemungkinan ada i seperti yang D(x⊕ri)=D(y⊕ri), dan dengan demikian h(x)i=h(y)i. Ini langsung menyarankan predikat kedekatan: jikah(x) cocok h(y) di salah satu nya k komponen, lalu x,ydekat; jika tidak, simpulkan bahwa mereka tidak dekat.
Jika Anda juga menginginkan tabrakan, konstruksi sederhana adalah sebagai berikut: biarkan h1(⋅)menjadi fungsi hash dengan predikat kedekatan; kemudianh(x)=(h1(x),SHA256(x)) tahan benturan (setiap tabrakan untuk ini juga merupakan tabrakan untuk SHA256) dan memiliki kedekatan kedekatan (cukup gunakan kedekatan kedekatan untuk h1). Anda bisa membiarkannyah1(⋅) menjadi fungsi hash yang didefinisikan di atas.
Ini semua untuk jarak Hamming. Edit jarak mungkin secara signifikan lebih sulit.
Dalam membuat konstruksi di atas, saya terinspirasi oleh makalah berikut:
Ari Juels, Martin Wattenberg. Skema Komitmen Fuzzy .
Ari Juels, Madhi Sudhan. Skema Vault Fuzzy . Desain, Kode, dan Kriptografi 38 (2): 237-257, 2006.
Kebetulan: dalam kriptografi, fungsi hash tidak dikunci. Jika Anda menginginkan sesuatu yang penting, Anda mungkin ingin melihat fungsi pseudorandom.