了解如何使用反向 Trie 有效偵測一次性電子郵件網域。使用專為快速、精確的結果而客製化的可擴展、記憶體高效的解決方案來優化您的網域查找。
一次性電子郵件可能會導致虛假註冊和垃圾郵件等問題。使用者從數千個臨時電子郵件產生器之一中取得一個位址並將其交給。即使是電子郵件正規表示式的 GOAT 也無法拯救您。
就我個人而言,我發現擁有所有一次性電子郵件網域的大列表是最簡單但最有效的解決方案。但在組裝該清單並啟動 for ... of 迴圈來檢查它之前,請考慮一下 O(n) 複雜度!
識別它們的一個好方法是使用反向 Trie,這是一種用於快速查找的高效資料結構。
首先,我們來了解一下什麼是 Trie。它是一種資料結構,其中字串為:
例如,如果我們餵蟒蛇、兄弟、布里乾酪,它會使用 Map 將它們組裝為:
b ├── o ── a └── r ── o └─── i ── e
這種方法允許直接查找,而無需循環遍歷整個清單。每個角色都引導著更深入的搜尋。
它以記憶體換取效率。尋找字串所花費的時間並不取決於列表的大小,而是取決於字串的長度!
反向 Trie 以相反的順序儲存字串,非常適合域:
透過反轉域名,搜尋從 TLD(例如 .com)開始,該域名在許多域名之間共享。為了進一步優化,它將 TLD 儲存為單一鍵 (com),而不是將其拆分為字元。域的其餘部分遵循標準的 Trie 結構。
由於這是一個樹狀結構,每個節點都會引用它的子節點:
type TrieNode = Map<string, TrieNode>;
首先,將 TLD 與域的其餘部分分開的實用程式函數:
private splitTLDFromRest(input: string) { const dot = input.lastIndexOf('.'); const TLD = input.substring(dot + 1); const rest = input.substring(0, dot); return [TLD, rest]; }
使用lastIndexOf 確保像 foo.bar.baz.com 這樣的子網域得到正確處理。
接下來,建構子將組裝 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); } } }
要檢查域是否是一次性的,請遍歷 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 } }
使用反向 Trie 有幾個好處:
如果您正在處理一次性電子郵件,這是一個可以實施的智慧、可擴展的解決方案。
以上是如何使用反向查找樹進行快速一次性電子郵件網域偵測的詳細內容。更多資訊請關注PHP中文網其他相關文章!