go语言:数组

go语言:数组,第1张

数组是一个由 固定长度 特定类型元素 组成的序列,一个数组可以由零个或多个元素组成。 数组是值类型

数组的每个元素都可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置,内置函数 len() 可以返回数组中元素的个数。

2类型的打印,结果的第二种打印方式

3对元素的修改或者赋值

4判断数组是否相等:长度、类型

4数组的地址:连续存储的空间

5数组的赋值、地址、取值

6数组的默认值

7数组的初始化

8数组的逆置

9求数组的最大值、最小值、平均值

10对数组字符串进行连接

11冒泡排序法的实现

12数组做函数的参数

13二维数组:赋值和地址

14二维数组:打印和输出

15 指针数组,每一个元素都是地址

17数组的内存分配

单向散列函数(one-wayfunction)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值 (hashvalue)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。

这里的消息不一定是人类能够读懂的文字,也可以是图像文件或者声音文件。单向散列函数不需要知道消息实

际代表的含义。无论任何消息,单向散列函数都会将它作为单纯的比特序列来处理,即根据比特序列计算出散

列值。

散列值的长度和消息的长度无关。无论消息是1比特,还是100MB,甚至是IOOGB,单向散列函数都会计算出固 定长度的散列值。以SHA-I单向散列函数为例,它所计算出的散列值的长度永远是160比特(20字节)。

单向散列函数的相关术语有很多变体,不同参考资料中所使用的术语也不同,下面我们就介绍其中的儿个。 单向散列函数也称为 消息摘要函数(message digest function) 哈希函数 或者 杂凑函数 。 输入单向散列函数的消息也称为 原像 (pre-image)

单向散列函数输出的散列值也称为 消息摘要 (message digest)或者 指纹 (fingerprint)。 完整性 也称为一致性。

MD4是由Rivest于1990年设计的单向散列函数,能够产生128比特的散列值(RFC1186,修订版RFC1320)。不 过,随着Dobbertin提出寻找MD4散列碰撞的方法,因此现在它已经不安全了。

MD5是由Rwest于1991年设计的单项散列函数,能够产生128比特的散列值(RFC1321)。

MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已

经不安全了。

MD4和MD5中的MD是消息摘要(Message Digest)的缩写。

SHA-1是由NIST(NationalInstituteOfStandardsandTechnology,美国国家标准技术研究所)设计的一种能够产生 160比特的散列值的单向散列函数。1993年被作为美国联邦信息处理标准规格(FIPS PUB 180)发布的是 SHA,1995年发布的修订版FIPS PUB 180-1称为SHA-1。

SHA-1的消息长度存在上限,但这个值接近于2^64比特,是个非常巨大的数值,因此在实际应用中没有问题。

SHA-256、SHA-384和SHA-512都是由NIST设计的单向散列函数,它们的散列值长度分别为256比特、384比特和

512比特。这些单向散列函数合起来统称SHA-2,它们的消息长度也存在上限(SHA-256的上限接近于 2^64 比特,

SHA-384 和 SHA-512的上限接近于 2^128 比特)。这些单向散列函数是于2002年和 SHA-1 一起作为 FIPS PUB 180-2 发布的 SHA-1 的强抗碰撞性已于2005年被攻破, 也就是说,现在已经能够产生具备相同散列值的两条不同的消 息。不过,SHA-2还尚未被攻破。

现在有个结构体如下定义:

我们需要初始化结构体,如果是其他语言,函数支持默认参数:

但是,go语言函数不支持默认参数,同时即使go语言支持默认参数,但是如果配置项过多,那么每一个配置项都得写一个默认参数,也不现实。

那么,在go语言中,我们怎么优雅的给其初始化呢,这时,就需要利用选项模式了(option)。

首先,我们定义一个option函数类型:

它接收一个参数: Server 。

然后定义一个 NewServer 函数,它接收一个 Option类型的不定参数:

最后,再直接定义一系列返回 Option的函数

使用时,直接:

语料库文件以特殊格式编码。这是种子语料库和生成语料库的相同格式。

下面是一个语料库文件的例子:

第一行用于通知模糊引擎文件的编码版本。虽然目前没有计划未来版本的编码格式,但设计必须支持这种可能性。

下面的每一行都是构成语料库条目的值,如果需要,可以直接复制到 Go 代码中。

在上面的示例中,我们在 a []byte后跟一个int64。这些类型必须按顺序与模糊测试参数完全匹配。这些类型的模糊目标如下所示:

指定您自己的种子语料库值的最简单方法是使用该 (testingF)Add方法。在上面的示例中,它看起来像这样:

但是,您可能有较大的二进制文件,您不希望将其作为代码复制到您的测试中,而是作为单独的种子语料库条目保留在 testdata/fuzz/{FuzzTestName} 目录中。golangorg/x/tools/cmd/file2fuzz 上的file2fuzz工具可用于将这些二进制文件转换为为[]byte

要使用此工具:

语料库条目:语料库 中的一个输入,可以在模糊测试时使用。这可以是特殊格式的文件,也可以是对 (testingF)Add。

覆盖指导: 一种模糊测试方法,它使用代码覆盖范围的扩展来确定哪些语料库条目值得保留以备将来使用。

失败的输入:失败的输入是一个语料库条目,当针对 模糊目标运行时会导致错误或恐慌。

fuzz target: 模糊测试的目标功能,在模糊测试时对语料库条目和生成的值执行。它通过将函数传递给 (testingF)Fuzz实现。

fuzz test: 测试文件中的一个被命名为func FuzzXxx(testingF)的函数,可用于模糊测试。

fuzzing: 一种自动化测试,它不断地 *** 纵程序的输入,以发现代码可能容易受到的错误或漏洞等问题。

fuzzing arguments: 将传递给 模糊测试目标的参数,并由mutator进行变异。

fuzzing engine: 一个管理fuzzing的工具,包括维护语料库、调用mutator、识别新的覆盖率和报告失败。

生成的语料库: 由模糊引擎随时间维护的语料库,同时模糊测试以跟踪进度。它存储在$GOCACHE/fuzz 中。这些条目仅在模糊测试时使用。

mutator: 一种在模糊测试时使用的工具,它在将语料库条目传递给模糊目标之前随机 *** 作它们。

package: 同一目录下编译在一起的源文件的集合。

种子语料库: 用户提供的用于模糊测试的语料库,可用于指导模糊引擎。它由 fAdd 在模糊测试中调用提供的语料库条目以及包内 testdata/fuzz/{FuzzTestName} 目录中的文件组成。这些条目默认使用go test运行,无论是否进行模糊测试。

测试文件: 格式为 xxx_testgo 的文件,可能包含测试、基准、示例和模糊测试。

漏洞: 代码中的安全敏感漏洞,可以被攻击者利用。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13495224.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存