gpt4 book ai didi

xml - 使用 XSL 对 XML 文件进行哈希处理

转载 作者:数据小太阳 更新时间:2023-10-29 01:43:05 25 4
gpt4 key购买 nike

我正在尝试找到一种“散列”XML 文件内容的方法。其根源是需要比较一些传递到我期望的文本节点的文本节点,以确保校验和相同。传入的文本节点已从表单提交返回,我需要确保它们没有被更改(在合理范围内,排除冲突)。

架构很糟糕,所以请不要问它!我被锁定在给定的共享点实现中,其中包含一些我需要解决的非常糟糕的自定义代码。

是否有可以实现的性能良好的校验和/哈希函数?我需要检查大约 100 个文本节点。

最佳答案

听起来你需要一个 position-dependent checksum .您是要 XSLT 实现还是只要求算法?

这是一个 implementation of Fletcher's checksum在 C 中,应该不会很难移植到 XSLT。

更新:下面是对 Fletcher 校验和的 XSLT 2.0 改编。它是否足够快,取决于您的数据大小和您拥有的时间量。我很想知道您的测试进行得如何。为了优化,我会尝试将 xs:integer 更改为 xs:int

请注意,我已将普通加法替换为上面链接的实现的按位或 (|)。我真的没有资格分析此更改对 uniformity 的影响。或 non-invertibility ,但只要您没有聪明的黑客试图恶意绕过您的校验和检查,这似乎就没问题。

请注意,由于上述更改,此实现不会给出与 Fletcher 校验和 (@MDBiker) 的真实实现相同的结果。例如,您不能将此函数的输出与 Java 的 Fletcher16 的输出进行比较。但是,对于相同的输入,它始终返回相同的结果(它是确定性的),因此您可以比较此函数在两个文本字符串上的输出。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:foo="my.foo.org">

<xsl:variable name="str1">The quick brown fox jumps over the lazy dog.</xsl:variable>
<xsl:variable name="str2">The quick frown box jumps over the hazy frog.</xsl:variable>

<xsl:template match="/">
Checksum 1: <xsl:value-of select="foo:checksum($str1)"/>
Checksum 2: <xsl:value-of select="foo:checksum($str2)"/>
</xsl:template>

<xsl:function name="foo:checksum" as="xs:int">
<xsl:param name="str" as="xs:string"/>
<xsl:variable name="codepoints" select="string-to-codepoints($str)"/>
<xsl:value-of select="foo:fletcher16($codepoints, count($codepoints), 1, 0, 0)"/>
</xsl:function>

<!-- can I change some xs:integers to xs:int and help performance? -->
<xsl:function name="foo:fletcher16">
<xsl:param name="str" as="xs:integer*"/>
<xsl:param name="len" as="xs:integer" />
<xsl:param name="index" as="xs:integer" />
<xsl:param name="sum1" as="xs:integer" />
<xsl:param name="sum2" as="xs:integer"/>
<xsl:choose>
<xsl:when test="$index gt $len">
<xsl:sequence select="$sum2 * 256 + $sum1"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="newSum1" as="xs:integer"
select="($sum1 + $str[$index]) mod 255"/>
<xsl:sequence select="foo:fletcher16($str, $len, $index + 1, $newSum1,
($sum2 + $newSum1) mod 255)" />
</xsl:otherwise>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>

输出:

    Checksum 1: 65256    
Checksum 2: 25689

用法说明:您说您需要对“XML 文件的内容运行校验和。其根源是需要比较一些文本节点”。如果将文本节点传递给 foo:checksum(),它将正常工作:将提取其字符串值。

仅供引用,我进行了性能测试,以计算 535KB XML 输入文件中文本节点的校验和。这是我使用的初始模板:

<xsl:template match="/">
Checksum of input: <xsl:value-of
select="sum(for $t in //text() return foo:checksum($t)) mod 65536"/>
</xsl:template>

它在 0.8 秒内完成,使用 Saxon PE。

或者:

如果文本量不是很大,简单地相互比较字符串本身(而不是校验和)可能会更快、更准确。但是,由于您的体系结构限制,您可能无法同时访问两个文本节点……从您的描述中我不清楚。

关于xml - 使用 XSL 对 XML 文件进行哈希处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6753343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com