Saya sedang mengerjakan rutinitas yang membandingkan string, tetapi untuk efisiensi yang lebih baik saya perlu menghapus semua karakter yang bukan huruf atau angka
Saya menggunakan beberapa fungsi DROP FUNCTION IF EXISTS alphanum; DELIMITER | CREATE FUNCTION alphanum( str CHAR(255) ) RETURNS CHAR(255) DETERMINISTIC BEGIN DECLARE i, len SMALLINT DEFAULT 1; DECLARE ret CHAR(255) DEFAULT ''; DECLARE c CHAR(1); IF str IS NOT NULL THEN SET len = CHAR_LENGTH( str ); REPEAT BEGIN SET c = MID( str, i, 1 ); IF c REGEXP '[[:alnum:]]' THEN SET ret=CONCAT(ret,c); END IF; SET i = i + 1; END; UNTIL i > len END REPEAT; ELSE SET ret=''; END IF; RETURN ret; END | DELIMITER ; 0 sekarang, tapi mungkin ada solusi yang lebih cepat dan lebih baik?
Solusi terbaik
Menggunakan MySQL8. 0 atau lebih tinggi
Atas kebaikan michal. jawaban jakubeczy di bawah, diganti dengan Regex sekarang didukung oleh MySQL
UPDATE {table} SET {column} = REGEXP_REPLACE({column}, '[^0-9a-zA-Z ]', '') _Menggunakan MySQL5. 7 atau lebih rendah
Regex tidak didukung di sini. Saya harus membuat fungsi saya sendiri yang disebut alphanum yang menghilangkan karakter untuk saya
DROP FUNCTION IF EXISTS alphanum; DELIMITER | CREATE FUNCTION alphanum( str CHAR(255) ) RETURNS CHAR(255) DETERMINISTIC BEGIN DECLARE i, len SMALLINT DEFAULT 1; DECLARE ret CHAR(255) DEFAULT ''; DECLARE c CHAR(1); IF str IS NOT NULL THEN SET len = CHAR_LENGTH( str ); REPEAT BEGIN SET c = MID( str, i, 1 ); IF c REGEXP '[[:alnum:]]' THEN SET ret=CONCAT(ret,c); END IF; SET i = i + 1; END; UNTIL i > len END REPEAT; ELSE SET ret=''; END IF; RETURN ret; END | DELIMITER ;Sekarang saya bisa melakukannya
select 'This works finally!', alphanum('This works finally!');dan saya mengerti
+---------------------+---------------------------------+ | This works finally! | alphanum('This works finally!') | +---------------------+---------------------------------+ | This works finally! | Thisworksfinally | +---------------------+---------------------------------+ 1 row in set (0.00 sec) _Hore
Solusi Terkait
Java – Cara menghasilkan string alfanumerik acak
Algoritma
Untuk menghasilkan string acak, gabungkan karakter yang diambil secara acak dari kumpulan simbol yang dapat diterima hingga string mencapai panjang yang diinginkan
Penerapan
Berikut adalah beberapa kode yang cukup sederhana dan sangat fleksibel untuk menghasilkan pengidentifikasi acak. Baca informasi berikut untuk catatan aplikasi penting
public class RandomString { /** * Generate a random string. */ public String nextString() { for (int idx = 0; idx < buf.length; ++idx) buf[idx] = symbols[random.nextInt(symbols.length)]; return new String(buf); } public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static final String lower = upper.toLowerCase(Locale.ROOT); public static final String digits = "0123456789"; public static final String alphanum = upper + lower + digits; private final Random random; private final char[] symbols; private final char[] buf; public RandomString(int length, Random random, String symbols) { if (length < 1) throw new IllegalArgumentException(); if (symbols.length() < 2) throw new IllegalArgumentException(); this.random = Objects.requireNonNull(random); this.symbols = symbols.toCharArray(); this.buf = new char[length]; } /** * Create an alphanumeric string generator. */ public RandomString(int length, Random random) { this(length, random, alphanum); } /** * Create an alphanumeric strings from a secure generator. */ public RandomString(int length) { this(length, new SecureRandom()); } /** * Create session identifiers. */ public RandomString() { this(21); } }Contoh penggunaan
Buat generator tidak aman untuk pengidentifikasi 8 karakter
RandomString gen = new RandomString(8, ThreadLocalRandom.current()); _Buat generator yang aman untuk pengidentifikasi sesi
Buat generator dengan kode yang mudah dibaca untuk dicetak. String lebih panjang dari string alfanumerik penuh untuk mengkompensasi penggunaan lebih sedikit simbol
String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx"; RandomString tickets = new RandomString(23, new SecureRandom(), easy); _Gunakan sebagai pengidentifikasi sesi
Menghasilkan pengidentifikasi sesi yang cenderung unik tidak cukup baik, atau Anda bisa menggunakan penghitung sederhana. Penyerang membajak sesi saat pengidentifikasi yang dapat diprediksi digunakan
Ada ketegangan antara panjang dan keamanan. Pengidentifikasi yang lebih pendek lebih mudah ditebak, karena kemungkinannya lebih sedikit. Tetapi pengidentifikasi yang lebih lama menghabiskan lebih banyak penyimpanan dan bandwidth. Serangkaian simbol yang lebih besar membantu, tetapi dapat menyebabkan masalah penyandian jika pengidentifikasi disertakan dalam URL atau dimasukkan kembali secara manual
Sumber dasar keacakan, atau entropi, untuk pengidentifikasi sesi harus berasal dari penghasil angka acak yang dirancang untuk kriptografi. Namun, menginisialisasi generator ini terkadang mahal atau lambat secara komputasi, jadi upaya harus dilakukan untuk menggunakannya kembali jika memungkinkan
Gunakan sebagai pengidentifikasi objek
Tidak setiap aplikasi membutuhkan keamanan. Penetapan acak dapat menjadi cara yang efisien bagi banyak entitas untuk menghasilkan pengidentifikasi di ruang bersama tanpa koordinasi atau partisi apa pun. Koordinasi bisa lambat, terutama di lingkungan yang terkelompok atau terdistribusi, dan pemisahan ruang menyebabkan masalah saat entitas berakhir dengan bagian yang terlalu kecil atau terlalu besar
Pengidentifikasi yang dihasilkan tanpa mengambil tindakan untuk membuatnya tidak dapat diprediksi harus dilindungi dengan cara lain jika penyerang dapat melihat dan memanipulasinya, seperti yang terjadi di sebagian besar aplikasi web. Harus ada sistem otorisasi terpisah yang melindungi objek yang pengidentifikasinya dapat ditebak oleh penyerang tanpa izin akses
Kehati-hatian juga harus dilakukan untuk menggunakan pengidentifikasi yang cukup panjang untuk membuat tabrakan tidak mungkin mengingat jumlah total pengidentifikasi yang diantisipasi. Ini disebut sebagai "paradoks ulang tahun. " p, kira-kira n2/(2qx), di mana n adalah jumlah pengenal yang sebenarnya dihasilkan, q adalah jumlah simbol yang berbeda dalam alfabet, dan x adalah panjang pengenal. Ini harus menjadi angka yang sangat kecil, seperti 2‑50 atau kurang
Mengerjakan ini menunjukkan bahwa kemungkinan tabrakan di antara 500k pengidentifikasi 15 karakter adalah sekitar 2-52, yang mungkin lebih kecil kemungkinannya daripada kesalahan yang tidak terdeteksi dari sinar kosmik, dll.
Bandingkan dengan UUID
Menurut spesifikasinya, tidak dirancang agar tidak dapat diprediksi, dan sebaiknya tidak digunakan sebagai pengidentifikasi sesi
UUID dalam format standarnya memakan banyak ruang. 36 karakter hanya untuk 122 bit entropi. (Tidak semua bit UUID "acak" dipilih secara acak. ) String alfanumerik yang dipilih secara acak mengemas lebih banyak entropi hanya dalam 21 karakter
UUID tidak fleksibel; . Ini adalah kebajikan utama sekaligus kelemahan utama mereka. Saat berkolaborasi dengan pihak luar, standarisasi yang ditawarkan oleh UUID mungkin bisa membantu. Untuk penggunaan internal murni, mereka bisa menjadi tidak efisien
C ++ - Cara mengulangi kata-kata dari sebuah string
Saya menggunakan ini untuk memisahkan string dengan pembatas. Yang pertama menempatkan hasilnya dalam vektor yang telah dibuat sebelumnya, yang kedua mengembalikan vektor baru
#include <string> #include <sstream> #include <vector> #include <iterator> template <typename Out> void split(const std::string &s, char delim, Out result) { std::istringstream iss(s); std::string item; while (std::getline(iss, item, delim)) { *result++ = item; } } std::vector<std::string> split(const std::string &s, char delim) { std::vector<std::string> elems; split(s, delim, std::back_inserter(elems)); return elems; } _Perhatikan bahwa solusi ini tidak melewatkan token kosong, jadi berikut ini akan menemukan 4 item, salah satunya kosong