Ketahui cara menggunakan Cubaan terbalik untuk mengesan domain e-mel pakai buang dengan cekap. Optimumkan carian domain anda dengan penyelesaian berskala yang cekap memori yang disesuaikan untuk hasil yang pantas dan tepat.
E-mel pakai buang boleh menyebabkan isu seperti pendaftaran palsu dan spam. Pengguna mengambil alamat daripada salah satu daripada ribuan penjana e-mel sementara dan menyerahkannya. Malah kambing regex e-mel tidak dapat menyelamatkan anda di sini.
Secara peribadi, saya mendapati mempunyai senarai besar semua domain e-mel pakai buang ialah penyelesaian yang paling mudah lagi berkesan. Tetapi sebelum anda menyusun senarai itu dan memulakan gelung untuk ... untuk menyemaknya, fikirkan kerumitan O(n)!
Cara terbaik untuk mengenal pasti mereka adalah dengan menggunakan Ujian Terbalik, struktur data yang cekap untuk carian pantas.
Pertama, mari kita fahami apa itu Trie. Ia ialah struktur data dengan rentetan:
contohnya, jika kita memberi makan boa, bro, brie, ia akan mengumpulkannya menggunakan Peta sebagai:
b ├── o ── a └── r ── o └─── i ── e
Pendekatan ini membolehkan carian terus tanpa melayari keseluruhan senarai. Setiap watak membimbing carian dengan lebih mendalam.
Ia menukar memori untuk kecekapan. Masa yang diperlukan untuk mencari rentetan tidak bergantung pada saiz senarai, tetapi pada panjang rentetan!
Satu Ujian Terbalik menyimpan rentetan dalam susunan terbalik, sesuai untuk domain:
Dengan membalikkan domain, carian bermula pada TLD (mis., .com), yang dikongsi merentas banyak domain. Untuk mengoptimumkan lagi, ia menyimpan TLD sebagai kunci tunggal (com), dan bukannya membahagikannya kepada aksara. Selebihnya domain mengikut struktur Trie standard.
Memandangkan ini ialah struktur pokok, setiap nod akan merujuk kepada anak-anaknya:
type TrieNode = Map<string, TrieNode>;
Pertama, fungsi utiliti untuk memisahkan TLD daripada domain yang lain:
private splitTLDFromRest(input: string) { const dot = input.lastIndexOf('.'); const TLD = input.substring(dot + 1); const rest = input.substring(0, dot); return [TLD, rest]; }
Menggunakan lastIndexOf memastikan subdomain seperti foo.bar.baz.com dikendalikan dengan betul.
Seterusnya, pembina akan memasang Trie:
export class ReverseTrieDomains { private root: TrieNode = new Map(); // ... constructor(...domains: string[]) { for (const domain of domains) { // For "didof.dev" const [TLD, rest] = this.splitTLDFromRest(domain); // dev, didof // Keep the refence to the TLD node for final set let node = this.root.get(TLD); if (!node) node = new Map(); // Start from TLD node, walk along the string in reverse let currentNode: TrieNode = node; for (let i = rest.length - 1; i >= 0; i--) { const char = rest[i]; let childNode = currentNode.get(char); if (!childNode) { childNode = new Map(); currentNode.set(char, childNode); } currentNode = childNode; } this.root.set(TLD, node); } } }
Untuk menyemak sama ada domain boleh guna, lewati Trie:
export class ReverseTrieDomains { // ... public has(domain: string) { const [TLD, rest] = this.splitTLDFromRest(domain) const node = this.root.get(TLD) if (!node) return false let currentNode: TrieNode = node let isFullDomainFound = false for (let i = rest.length - 1; i >= 0; i--) { const char = rest[i] const childNode = currentNode.get(char) if (!childNode) return false currentNode = childNode if (i === 0) { isFullDomainFound = currentNode.size === 0; } } return isFullDomainFound } }
Menggunakan Trie terbalik menawarkan beberapa faedah:
Jika anda berurusan dengan e-mel pakai buang, ini ialah penyelesaian yang bijak dan berskala untuk dilaksanakan.
Atas ialah kandungan terperinci Cara Menggunakan Percubaan Terbalik untuk Pengesanan Domain E-mel Pakai Pantas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!