0

0

如何使用反向查找树进行快速一次性电子邮件域检测

霞舞

霞舞

发布时间:2024-12-06 20:42:11

|

992人浏览过

|

来源于dev.to

转载

如何使用反向查找树进行快速一次性电子邮件域检测

了解如何使用反向 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 结构。

Solvely
Solvely

AI学习伴侣,数学解体,作业助手,家教辅导

下载

反向 trie 域实现

由于这是一个树结构,每个节点都会引用它的子节点:

type trienode = map;

首先,将 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)
            console.log(i, char, childNode)
            if (!childNode) return false
            currentNode = childNode
            if (i === 0) {
                isFullDomainFound = currentNode.size === 0;
            }
        }

        return isFullDomainFound
    }
}

结论

使用反向 trie 有几个好处:

  • 快速查找:逐步遍历字符以获得快速结果。
  • 内存效率:.com等常见后缀仅存储一次。
  • 可扩展性:轻松处理大型域列表。

如果您正在处理一次性电子邮件,这是一个可以实施的智能、可扩展的解决方案。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

247

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

349

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

232

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

2

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号