Saya pada dasarnya menyiapkan frase untuk dimasukkan ke dalam database, mereka mungkin cacat jadi saya ingin menyimpan hash pendek dari mereka sebagai gantinya (saya akan hanya membandingkan apakah ada atau tidak, jadi hash sangat ideal).
Saya menganggap MD5 cukup lambat pada 100.000+ permintaan jadi saya ingin tahu apa yang akan menjadi metode terbaik untuk hash frase, mungkin meluncurkan fungsi hash saya sendiri atau menggunakan hash('md4', '...'
akan lebih cepat pada akhirnya?
Saya tahu MySQL memiliki MD5 (), jadi itu akan melengkapi sedikit kecepatan pada akhir permintaan, tapi mungkin ada fungsi hashing lebih lanjut di MySQL Saya tidak tahu tentang itu akan bekerja dengan PHP ..
Jawaban:
CRC32 cukup cepat dan ada fungsinya: http://www.php.net/manual/en/function.crc32.php
Tetapi Anda harus menyadari bahwa CRC32 akan memiliki lebih banyak tabrakan daripada hash MD5 atau bahkan SHA-1, hanya karena panjangnya yang berkurang (32 bit dibandingkan dengan 128 bit masing-masing 160 bit). Tetapi jika Anda hanya ingin memeriksa apakah string yang disimpan rusak, Anda akan baik-baik saja dengan CRC32.
sumber
Dan kode yang digunakan untuk menghasilkan ini adalah:
sumber
hash_algos()
. Kode pembandingan hash berikut ada di komentar PHP ==> codepad.viper-7.com/5Wdhw6md5
lebih cepat. Tes yang lebih baik adalah mengacak konten string dan panjangnya juga. dengan cara ini kita mendapatkan ide yang lebih baik tentang kinerja dunia nyata yang sebenarnya. Ini juga akan menghindari caching. Lihatlah: kinerja php hashing checksumDaftar peringkat di mana setiap loop berbagi hal yang sama untuk crypt seperti yang lainnya.
Dan hasilnya
sumber
strlen($characters)
seharusnyastrlen($characters) - 1
:)Ada perbandingan kecepatan di situs xxhash. Salin menempelkannya di sini:
Jadi sepertinya xxHash adalah yang paling cepat, sementara banyak lainnya mengalahkan hash yang lebih tua, seperti CRC32, MD5 dan SHA.
https://code.google.com/p/xxhash/
Perhatikan bahwa ini adalah pemesanan pada kompilasi 32-bit. Pada kompilasi 64-bit, urutan kinerja kemungkinan sangat berbeda. Beberapa hash didasarkan pada multiplikasi dan pengambilan 64-bit.
sumber
Tampaknya crc32 lebih cepat untuk pesan kecil (dalam hal ini 26 karakter) sedangkan md5 untuk pesan yang lebih panjang (dalam hal ini> 852 karakter).
sumber
Pembaruan 2019: Jawaban ini adalah yang terbaru. Perpustakaan untuk mendukung murmur sebagian besar tersedia untuk semua bahasa.
Rekomendasi saat ini adalah dengan menggunakan Murmur Hash Keluarga (lihat khususnya murmur2 atau murmur3 varian).
Hash Murmur dirancang untuk hashing cepat dengan tabrakan minimal (jauh lebih cepat dari CRC, MDx dan SHAx). Sangat sempurna untuk mencari duplikat dan sangat sesuai untuk indeks HashTable.
Bahkan itu digunakan oleh banyak database modern (Redis, ElastisSearch, Cassandra) untuk menghitung semua jenis hash untuk berbagai keperluan. Algoritma khusus ini adalah sumber utama dari banyak peningkatan kinerja dalam dekade ini.
Ini juga digunakan dalam implementasi Filter Bloom . Anda harus menyadari bahwa jika Anda mencari "hash cepat", Anda mungkin menghadapi masalah khas yang diselesaikan oleh filter Bloom. ;-)
Catatan : murmur adalah hash tujuan umum, artinya NON kriptografis. Itu tidak mencegah untuk menemukan sumber "teks" yang menghasilkan hash. Ini TIDAK sesuai dengan kata sandi hash.
Beberapa detail lainnya: MurmurHash - apa itu?
sumber
Alih-alih mengasumsikan MD5 "cukup lambat", cobalah. Implementasi MD5 berbasis C sederhana pada PC sederhana (tambang, 2,4 GHz Core2, menggunakan inti tunggal) dapat memotong 6 juta pesan kecil per detik . Sebuah pesan kecil ada di sini apa saja hingga 55 byte. Untuk pesan yang lebih lama, kecepatan hashing MD5 linier dengan ukuran pesan, yaitu mengolah data sekitar 400 megabita per detik. Anda dapat mencatat bahwa ini adalah empat kali kecepatan maksimum harddisk yang baik atau kartu jaringan ethernet gigabit.
Karena PC saya memiliki empat inti, ini berarti bahwa hashing data secepat harddisk saya dapat menyediakan atau menerima penggunaan paling banyak 6% dari daya komputasi yang tersedia. Dibutuhkan situasi yang sangat istimewa untuk mempercepat hashing menjadi bottleneck atau bahkan menyebabkan biaya yang nyata pada PC.
Pada arsitektur jauh lebih kecil di mana kecepatan hashing mungkin menjadi agak relevan, Anda mungkin ingin menggunakan MD4. MD4 baik untuk tujuan non-kriptografi (dan untuk tujuan kriptografi, Anda tidak boleh menggunakan MD5). Telah dilaporkan bahwa MD4 bahkan lebih cepat daripada CRC32 pada platform berbasis ARM.
sumber
Peringatan
Jawaban di bawah ini tidak menjawab pertanyaan sebagaimana ditanyakan, karena tidak merekomendasikan fungsi hash. Ingat, "Fungsi hash adalah fungsi apa pun yang dapat digunakan untuk memetakan data dari ukuran arbitrer ke nilai ukuran tetap." (Wikipedia) Jawaban di bawah ini merekomendasikan transformasi yang tidak menjamin hasil ukuran tetap.
Jika Anda bersedia untuk rileks persyaratan menggunakan fungsi hash , baca terus ...
Jawaban Asli
Saya sarankan urlencode () atau base64_encode () karena alasan berikut:
Mengadaptasi kode benchmark di tempat lain dalam balasan ini, saya telah menunjukkan bahwa salah satu dari ini jauh lebih cepat daripada algoritma hash apa pun. Bergantung pada aplikasi Anda, Anda mungkin dapat menggunakan urlencode () atau base64_encode () untuk membersihkan string 'salah format' yang ingin Anda simpan.
sumber
Langkah Satu: Instal libsodium (atau pastikan Anda menggunakan PHP 7.2+)
Langkah Dua: Gunakan salah satu dari yang berikut:
sodium_crypto_generichash()
, yang merupakan BLAKE2b , fungsi hash lebih aman daripada MD5 tetapi lebih cepat dari SHA256. (Tautan memiliki tolok ukur, dll.)sodium_crypto_shorthash()
, yaitu SipHash-2-4 , yang sesuai untuk tabel hash tetapi tidak harus diandalkan untuk resistensi tabrakan._shorthash
sekitar 3x lebih cepat_generichash
, tetapi Anda perlu kunci dan Anda memiliki risiko tabrakan yang kecil tapi realistis. Dengan_generichash
, Anda mungkin tidak perlu khawatir tentang tabrakan, dan tidak perlu menggunakan kunci (tetapi mungkin ingin tetap melakukannya).sumber
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)
- blake2b tentu saja, tetapi implementasi PHP USERLAND dari blake2b akan menjadi jauh lebih lambat daripada sha256 yang diimplementasikan C untuk PHP ... saya berharap PHP dapat mengadaptasi blake2b di hash_algos () suite ..Jika Anda mencari yang cepat dan unik, saya sarankan xxHash atau sesuatu yang menggunakan perintah built-in cc32c cpu yang lebih baru, lihat https://stackoverflow.com/a/11422479/32453 . Juga ada tautan ke hash yang mungkin lebih cepat jika Anda tidak terlalu peduli dengan kemungkinan benturan.
sumber
Adler32 berkinerja terbaik di mesin saya. Dan
md5()
ternyata lebih cepat daricrc32()
.sumber
Implementasi untuk md5 di dalam hash sedikit lebih cepat daripada md5 (). Jadi ini bisa menjadi pilihan atau yang lain, silakan coba:
Anda dapat melihat di http://www.dozent.net/Tipps-Tricks/PHP/hash-performance
sumber
CRC32 lebih cepat, tetapi kurang aman dibandingkan MD5 dan SHA1. Tidak ada banyak perbedaan kecepatan antara MD5 dan SHA1.
sumber