Satu huruf terlihat, dua urutan
Kata Café dapat mengandung satu é yang tersusun, U+00E9, atau e diikuti dengan kombinasi aksent akut, U+0065 U+0301. Banyak fonta menggambar mereka dengan cara yang sama. Dalam UTF-8, é yang tersusun menggunakan byte C3 A9, sementara bentuk terurai menggunakan 65 CC 81. SHA-256 menghash byte input, sehingga dua ejaan ini memberikan digest yang berbeda meskipun pembaca mungkin melihat kata yang sama. Ini bukan kegagalan hash. Ini adalah ketidakcocokan antara perbandingan visual dan perbandingan byte. Pertahankan bentuk sumber ketika menyelidiki ringkasan yang tidak diharapkan.
Normalisasi di bawah perjanjian eksplisit
Unicode NFC menyusun urutan yang layak menjadi bentuk kanonikal; NFD menguraikannya. Jika dua sistem setuju untuk normalisasi ke NFC sebelum encoding sebagai UTF-8 dan hashing, dua ejaan Café dalam contoh mencapai urutan byte kanonikal yang sama. Alat NFC tertanam memungkinkan Anda menguji masukan yang terdekompos. Urutan penting: normalisasi karakter, encode karakter-karakter itu ke UTF-8 byte, lalu hash byte-byte yang tepat. Hashing pertama menghancurkan informasi yang diperlukan untuk menyelaraskan ejaan yang setara. Dokumen bentuk normalisasi dalam kontrak data sehingga setiap peserta melakukan operasi yang sama.
- Café: tersusun é atau e + aksen
- NFC → satu urutan karakter yang dipilih
- Byte UTF-8 → ringkasan SHA-256
Jangan normalisasi segalanya secara buta
Normalisasi dapat mengubah teks sumber yang tepat, dan bentuk kompatibilitas NFKC dan NFKD membuat substitusi yang lebih luas daripada NFC dan NFD. Yang mungkin berguna untuk indeks pencarian tetapi tidak sesuai untuk transkripsi hukum, tanda tangan digital atas dokumen yang ada atau sistem yang menjanjikan byte-by-byte arsip. Lipatan kasus, memotong ruang dan mengubah akhir garis adalah pilihan tambahan, bukan bagian otomatis dari NFC. Spesifikasi protokol dapat meminta byte asli atau mendefinisikan prosedur kanonisasi yang berbeda. Ikuti aturan itu daripada menerapkan normalisasi setelah menemukan ketidakcocokan.
Periksa byte dengan tes yang terkontrol
Buat dua string pendek: satu dengan é tersusun dan satu dengan e plus tanda kombinasi. Jalankan masing-masing melalui pemirsa byte UTF-8 dan perhatikan C3 A9 versus 65 CC 81 di akhir. Hash string raw secara terpisah; digest mereka harus berbeda. Kemudian terapkan NFC ke masing-masing, periksa byte mereka lagi dan bandingkan dengan SHA-256 digests. Perhatikan ruang, baris baru dan karakter tersembunyi dalam input yang disalin, yang juga dapat mengubah ringkasan. Tes ini harus membandingkan algoritma dan encoding yang identik; nilai SHA-256 tidak dapat dibandingkan secara langsung dengan SHA-512.
Pilih perbandingan yang Anda butuhkan
Untuk periksa integritas file, hashing byte asli biasanya adalah poin: perubahan byte apapun harus terlihat. Untuk deduplikasi nama yang dimasukkan manusia, kebijakan normalisasi teks yang terdokumentasi mungkin masuk akal sebelum hashing, meskipun nama juga memiliki kasus dan masalah bahasa yang satu bentuk Unicode tidak menyelesaikan. Untuk sandi dan otentikasi, desain keamanan khusus mengatur normalisasi dan hashing sandi; SHA-256 sandi biasa tidak cukup penyimpanan. Katakan apakah tujuannya adalah identitas byte, kesetaraan teks yang dinormalisasi atau kesamaan manusia. Ini adalah janji-janji yang berbeda, dan tidak ada konverter dapat menyimpulkan yang dimaksudkan dari penampilan saja.