Anda tidak perlu menulis fungsi Anda sendiri - orang lain sudah melakukannya untuk Anda.
Sebagai contoh saya mengumpulkan dan membandingkan lima fungsi hash VBA pada jawaban stackoverflow ini
Secara pribadi saya menggunakan fungsi VBA ini
- disebut dengan
=BASE64SHA1(A1)
di Excel setelah Anda menyalin makro ke modul VBA
- memerlukan .NET karena menggunakan pustaka "Microsoft MSXML" (dengan pengikatan yang lebih lambat)
Public Function BASE64SHA1(ByVal sTextToHash As String)
Dim asc As Object
Dim enc As Object
Dim TextToHash() As Byte
Dim SharedSecretKey() As Byte
Dim bytes() As Byte
Const cutoff As Integer = 5
Set asc = CreateObject("System.Text.UTF8Encoding")
Set enc = CreateObject("System.Security.Cryptography.HMACSHA1")
TextToHash = asc.GetBytes_4(sTextToHash)
SharedSecretKey = asc.GetBytes_4(sTextToHash)
enc.Key = SharedSecretKey
bytes = enc.ComputeHash_2((TextToHash))
BASE64SHA1 = EncodeBase64(bytes)
BASE64SHA1 = Left(BASE64SHA1, cutoff)
Set asc = Nothing
Set enc = Nothing
End Function
Private Function EncodeBase64(ByRef arrData() As Byte) As String
Dim objXML As Object
Dim objNode As Object
Set objXML = CreateObject("MSXML2.DOMDocument")
Set objNode = objXML.createElement("b64")
objNode.DataType = "bin.base64"
objNode.nodeTypedValue = arrData
EncodeBase64 = objNode.text
Set objNode = Nothing
Set objXML = Nothing
End Function
Menyesuaikan panjang hash
- hash awalnya adalah string unicode panjang 28 karakter (case sensitif + karakter khusus)
- Anda menyesuaikan panjang hash dengan baris ini:
Const cutoff As Integer = 5
- 4 digit hash = 36 tumbukan di 6895 baris = tingkat tumbukan 0,5%
- 5 digit hash = 0 collision di 6895 baris = 0% collision rate
Ada juga fungsi hash ( ketiga fungsi CRC16 ) yang tidak memerlukan .NET dan tidak menggunakan perpustakaan eksternal. Tetapi hash lebih panjang dan menghasilkan lebih banyak tabrakan.
Anda juga bisa mengunduh contoh buku kerja ini dan bermain-main dengan semua 5 implementasi hash. Seperti yang Anda lihat ada perbandingan yang bagus di lembar pertama
#NAME?
. Lihat kode> potong dan tempel kode ke jendela baru - di dalam lembar kerja yang benar di navigator> simpan sebagai lembar kerja berkemampuan makro> tutup dan kembali ke excel ... hal lain yang saya lewatkan? Apakah saya perlu mengkompilasinya?cutoff
parameter dan opsional dengan default berbeda dengan memindahkannya ke daftar Parameter fungsiPublic Function BASE64SHA1(ByVal sTextToHash As String, Optional ByVal cutoff As Integer = 8)
dan menghapus deklarasi di dalam fungsi.Saya tidak terlalu peduli tentang tabrakan, tetapi membutuhkan pseudorandomizer baris yang lemah berdasarkan bidang string panjang variabel. Inilah salah satu solusi gila yang bekerja dengan baik:
Di mana
Z2
sel berisi string yang ingin Anda hash."MOD" ada di sana untuk mencegah meluap ke notasi ilmiah.
1009
adalah yang utama, bisa menggunakan apa pun X sehingga X * 255 <max_int_size
. 10 adalah arbitrer; gunakan apa saja. Nilai "Lain" adalah arbitrer (angka pi di sini!); gunakan apa saja. Lokasi karakter (1,3,5,7,9) sewenang-wenang; gunakan apa saja.sumber
Untuk daftar yang cukup kecil, Anda dapat membuat pengacak (fungsi hash orang miskin) menggunakan fungsi Excel bawaan.
Misalnya
Di sini A1 dan B1 memegang huruf awal acak dan panjang string.
Sedikit mengutak-atik dan memeriksa dan dalam banyak kasus Anda bisa mendapatkan ID unik yang bisa diterapkan dengan cukup cepat.
Cara Kerja : Rumus menggunakan huruf pertama dari string dan huruf tetap yang diambil dari mid-string dan menggunakan LEN () sebagai 'fungsi mengipasi' untuk mengurangi kemungkinan tabrakan.
CAVEAT : ini bukan hash, tetapi ketika Anda perlu menyelesaikan sesuatu dengan cepat, dan dapat memeriksa hasilnya untuk melihat bahwa tidak ada tabrakan, itu bekerja dengan cukup baik.
Sunting: Jika string Anda harus memiliki panjang variabel (misalnya nama lengkap) tetapi ditarik dari catatan basis data dengan bidang lebar tetap, Anda ingin melakukannya seperti ini:
sehingga panjangnya adalah pengacak yang berarti.
sumber
Saya menggunakan ini yang memberikan hasil yang cukup bagus dengan mencegah bentrok tanpa perlu menjalankan skrip setiap kali. Saya membutuhkan nilai antara 0 - 1.
Ini mengambil surat dari seluruh string, mengambil nilai dari masing-masing surat, menambahkan nilai (untuk mencegah huruf yang sama di tempat yang berbeda memberikan hasil yang sama), mengalikan / membagi masing-masing dan menjalankan fungsi COS di atas total.
sumber
Anda bisa mencoba ini. Jalankan Pseudo # pada dua kolom:
Di mana A1 dan B1 menyimpan benih acak yang dimasukkan secara manual: 0
sumber
Setahu saya tidak ada fungsi hash build ke Excel - Anda harus membangunnya sebagai Fungsi yang Ditentukan Pengguna di VBA.
Namun, harap dicatat bahwa untuk tujuan Anda, saya tidak berpikir menggunakan hash diperlukan atau benar-benar menguntungkan!
VLOOKUP
akan bekerja dengan baik pada 256 byte karena akan pada hash yang lebih kecil. Tentu, itu mungkin sedikit lebih lambat - sedikit yang pasti sangat kecil sehingga tak terukur. Dan kemudian menambahkan nilai hash lebih banyak usaha untuk Anda - dan untuk Excel ...sumber
title
di panel kiri beku saya ...