首頁 > web前端 > js教程 > 如何使用反向查找樹進行快速一次性電子郵件網域偵測

如何使用反向查找樹進行快速一次性電子郵件網域偵測

DDD
發布: 2024-12-14 03:42:09
原創
591 人瀏覽過

How to Use a Reverse Trie for Fast Disposable Email Domain Detection

了解如何使用反向 Trie 有效偵測一次性電子郵件網域。使用專為快速、精確的結果而客製化的可擴展、記憶體高效的解決方案來優化您的網域查找。

  • 閱讀我網站上的文章
  • 使用免費的一次性電子郵件網域偵測器

一次性電子郵件可能會導致虛假註冊和垃圾郵件等問題。使用者從數千個臨時電子郵件產生器之一中取得一個位址並將其交給。即使是電子郵件正規表示式的 GOAT 也無法拯救您。

就我個人而言,我發現擁有所有一次性電子郵件網域的大列表是最簡單但最有效的解決方案。但在組裝該清單並啟動 for ... of 迴圈來檢查它之前,請考慮一下 O(n) 複雜度!

識別它們的一個好方法是使用反向 Trie,這是一種用於快速查找的高效資料結構。

什麼是反向特里樹?

首先,我們來了解一下什麼是 Trie。它是一種資料結構,其中字串為:

  • 切碎,逐字
  • 組裝成樹狀結構

例如,如果我們餵蟒蛇、兄弟、布里乾酪,它會使用 Map 將它們組裝為:

b
 ├── o ── a
 └── r ── o  
     └─── i ── e
登入後複製

這種方法允許直接查找,而無需循環遍歷整個清單。每個角色都引導著更深入的搜尋。

它以記憶體換取效率。尋找字串所花費的時間並不取決於列表的大小,而是取決於字串的長度!

反向 Trie 以相反的順序儲存字串,非常適合域:

  • mailinator.com 變成 moc.rotanliam
  • 垃圾郵件.com 變成 moc.liambhsart

關於此實施的注意事項

透過反轉域名,搜尋從 TLD(例如 .com)開始,該域名在許多域名之間共享。為了進一步優化,它將 TLD 儲存為單一鍵 (com),而不是將其拆分為字元。域的其餘部分遵循標準的 Trie 結構。

反向 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 有幾個好處:

  • 快速尋找:逐步遍歷字元以獲得快速結果。
  • 記憶體效率:.com等常見後綴僅儲存一次。
  • 可擴充性:輕鬆處理大型網域清單。

如果您正在處理一次性電子郵件,這是一個可以實施的智慧、可擴展的解決方案。

以上是如何使用反向查找樹進行快速一次性電子郵件網域偵測的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板