替换许多字符串的更好方法 - C# 中的混淆

2024-02-20

我试图混淆大量数据。我创建了一个要替换的单词(标记)列表,并且使用 StringBuilder 类逐个替换单词,如下所示:

 var sb = new StringBuilder(one_MB_string);
 foreach(var token in tokens)
 {
   sb.Replace(token, "new string");
 }

速度相当慢!我可以做一些简单的事情来加快速度吗?

tokens是大约一千个字符串的列表,每个字符串长度为 5 到 15 个字符。


不要在一个巨大的字符串中进行替换(这意味着您需要移动大量数据),而是遍历该字符串并一次替换一个标记。

创建一个包含每个标记的下一个索引的列表,找到第一个标记,然后将文本复制到该标记到结果,然后替换该标记。然后检查该标记下一次出现在字符串中的位置,以使列表保持最新。重复此操作,直到找不到更多标记,然后将剩余文本复制到结果中。

我做了一个简单的测试,这个方法在208毫秒内对1000000个字符串进行了125000次替换。

Token 和 TokenList 类:

public class Token {

    public string Text { get; private set; }
    public string Replacement { get; private set; }
    public int Index { get; set; }

    public Token(string text, string replacement) {
        Text = text;
        Replacement = replacement;
    }

}

public class TokenList : List<Token>{

    public void Add(string text, string replacement) {
        Add(new Token(text, replacement));
    }

    private Token GetFirstToken() {
        Token result = null;
        int index = int.MaxValue;
        foreach (Token token in this) {
            if (token.Index != -1 && token.Index < index) {
                index = token.Index;
                result = token;
            }
        }
        return result;
    }

    public string Replace(string text) {
        StringBuilder result = new StringBuilder();
        foreach (Token token in this) {
            token.Index = text.IndexOf(token.Text);
        }
        int index = 0;
        Token next;
        while ((next = GetFirstToken()) != null) {
            if (index < next.Index) {
                result.Append(text, index, next.Index - index);
                index = next.Index;
            }
            result.Append(next.Replacement);
            index += next.Text.Length;
            next.Index = text.IndexOf(next.Text, index);
        }
        if (index < text.Length) {
            result.Append(text, index, text.Length - index);
        }
        return result.ToString();
    }

}

使用示例:

string text =
    "This is a text with some words that will be replaced by tokens.";

var tokens = new TokenList();
tokens.Add("text", "TXT");
tokens.Add("words", "WRD");
tokens.Add("replaced", "RPL");

string result = tokens.Replace(text);
Console.WriteLine(result);

Output:

This is a TXT with some WRD that will be RPL by tokens.

Note:此代码不处理重叠标记。例如,如果您有标记“pineapple”和“apple”,则代码将无法正常工作。

Edit:
要使代码能够处理重叠标记,请替换此行:

next.Index = text.IndexOf(next.Text, index);

用这个代码:

foreach (Token token in this) {
    if (token.Index != -1 && token.Index < index) {
        token.Index = text.IndexOf(token.Text, index);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换许多字符串的更好方法 - C# 中的混淆 的相关文章

  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 超慢的表格布局性能

    我遇到了糟糕的 TableLayout 性能 我在这里读过一些帖子 谈论同样的事情 Android 动态创建表 性能不佳 https stackoverflow com questions 9813427 android dynamical
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 意外的 const 引用行为

    include
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐

  • 如何使用 NHibernate 高效地进行 TDD?

    在我看来 大多数人在使用 NHibernate 时都会针对内存中 进程内数据库 例如 SQLite 编写测试 我已经启动并运行了它 但我的第一个测试 使用 NHibernate 总是需要 3 4 秒才能执行 下一个测试运行得更快 我使用 F
  • 是否有 gist.github.com 的内部替代方案可以在防火墙后面运行?

    gist github com 非常方便 但我希望能够运行类似的东西来与我工作的防火墙后面的其他开发人员在内部共享代码示例 因此我不需要一直清理我的代码 只讲代码示例 有这样的事情存在吗 我并不追求大型项目管理工具 只是一种制作一次性要点并
  • OpenShift 无法处理某些 Nodejs 依赖项 (Koa)

    我已经结账了如何在 Openshift 中设置 KoaJS https stackoverflow com questions 26924967 how to setup koajs in openshift但它仍然不起作用 这是我的一部分
  • Apache 作为 ubuntu 上的 root

    好的 我需要运行我的 Apache Web 服务器root 为此我输入了whoami 在终端 它给了我输出 root 但是当我通过执行以下 php 脚本检查我的 apache 服务器是否以 root 用户身份运行时 它给了我输出 nobod
  • 从终端安装 npm 错误

    我正在尝试在我的 mac 中安装节点 我收到以下错误 我从节点站点下载了节点并运行了该包 你们能告诉我为什么我会遇到这个错误 当我执行 npm install 时 MacBook Pro Raj npm install npm ERR in
  • Pickle 无法与 tkinter 一起使用

    我正在用 Tkinter 制作一个小游戏 它有一个使用 pickle 的保存功能 但是 当我尝试保存时 它会弹出以下消息 Exception in Tkinter callback Traceback most recent call la
  • 具有嵌套列表的 Terraform 动态块

    我需要使用 Terraform 在 Pagerduty 中创建升级策略 我想动态创建rule块 然后在其中target块的值来自rule 我不知道如何在目标块内进行第二次调用以使其动态 我有一个列表中的团队列表 locals teams d
  • React Native - 动态列出/需要目录中的文件

    我正在使用 Redux 并希望动态包含目录中的所有文件 redux index js Actions import as authActions from auth authActions import as deviceActions f
  • 如何从图像中仅提取字符?

    我有这种类型的图像 我只想从中提取字符 二值化后 我得到这个图像 img cv2 imread the image jpg gray cv2 cvtColor img cv2 COLOR BGR2GRAY thresh cv2 adapti
  • 如何在密度分布图的两端添加两个阴影

    如何在两端添加阴影 如下图所示 我想添加一端从 0 到 995 和 1 995 到 Inf 我在这里尝试了解决方案https stackoverflow com a 4371473 3133957 https stackoverflow c
  • 如何用 Python 构建提升图(又名增益图)?

    我刚刚使用 scikit learn 创建了一个模型 它可以估计客户对某些报价做出回应的可能性 现在我正在尝试评估我的模型 为此 我想绘制提升图 我理解 lift 的概念 但我很难理解如何在 python 中实际实现它 您可以使用sciki
  • NetLogo 以字符列表的形式读入文件

    我是 NetLogo 新手 我有一个包含一行值的文本文件 ABC CDC BBC 我试图读取该文件的第一行作为字符列表 例如 A B C 我一直在尝试使用文件读取行 但它创建了一个字符串 ABC observer gt file open
  • 如何开始程序生成?

    程序生成 http en wikipedia org wiki Procedural generation最近 由 Spore MMO 等 引起了人们的关注 它似乎是一种有趣 强大的编程技术 我的问题是 您知道有哪些使用程序生成技术的中型项
  • 在 ASP.NET WebApi 中测试路由配置

    我正在尝试对我的进行一些单元测试WebApi http www asp net web api路由配置 我想测试一下路线 api super 映射到Get 我的方法SuperController 我已经设置了以下测试 但遇到了一些问题 pu
  • 为复选框数组放置错误消息

    我正在使用 jQuery 的验证插件 它的效果非常好 除非我有一组复选框 错误消息将在第一个复选框之后显示 就像这样 tbody tbody
  • 在docker容器中运行djangoworker和daphne

    我有在 docker 容器中运行的 django 应用程序 最近我发现我需要向我的应用程序添加 websockets 接口 我在 nginx 和 redis 后面使用带有 daphne 的通道作为缓存 问题是我必须在 1 个容器中运行 dj
  • 转移可变借用的所有权

    我的理解是 可变借款人可以将所有权转移给另一个可变借款人 但这个移动似乎与移动非指针变量有点不同 让我们看一个例子 以下p1被转移到p2 when compute 被称为第一次 但所有权似乎又回到了p1 after compute 返回 f
  • 覆盖目标 Android Makefile 的命令

    我正在尝试使用 g 编译我的 Android ndk 项目中的模块之一 尽管源代码都是 C 语言 make 系统警告刺激了我的眼睛 C NVPACK android ndk r8d build core build binary mk 34
  • Flexbox 列自身与底部对齐

    我正在尝试使用 Flexbox http css tricks com almanac properties a align content http css tricks com almanac properties a align co
  • 替换许多字符串的更好方法 - C# 中的混淆

    我试图混淆大量数据 我创建了一个要替换的单词 标记 列表 并且使用 StringBuilder 类逐个替换单词 如下所示 var sb new StringBuilder one MB string foreach var token in