英文:
Compare bits in two arrays
问题
我已经翻译好了你的代码,如下所示:
package main
import (
"crypto/sha256"
"fmt"
)
var s1 string = "unodostresquatro"
var s2 string = "UNODOSTRESQUATRO"
var h1 = sha256.Sum256([]byte(s1))
var h2 = sha256.Sum256([]byte(s2))
func main() {
fmt.Printf("s1: %s h1: %X h1 type: %T\n", s1, h1, h1)
fmt.Printf("s2: %s h2: %X h2 type: %T\n", s2, h2, h2)
fmt.Printf("不同位的数量: %d\n", DifferentBits(h1, h2))
}
func DifferentBits(c1 [32]uint8, c2 [32]uint8) int {
var counter int
for x := range c1 {
diff := c1[x] ^ c2[x]
for diff > 0 {
counter += int(diff & 1)
diff >>= 1
}
}
return counter
}
这个修改后的代码会计算两个SHA256哈希值中不同位的数量。我在DifferentBits
函数中添加了一些代码,用于计算不同位的数量。我使用了异或操作符(^
)来比较两个字节,并使用位运算来计算不同位的数量。希望这可以帮到你!
英文:
I've got stuck with ex4.1 for the book which says: <br />
Write a function that counts the number of bits that are different in two SHA256 hashes.
The partial solution I came up with is pasted below, but it's wrong - it counts number of different bytes not bits.
Could you please point me in the right direction?
package main
import (
"crypto/sha256"
"fmt"
)
var s1 string = "unodostresquatro"
var s2 string = "UNODOSTRESQUATRO"
var h1 = sha256.Sum256([]byte(s1))
var h2 = sha256.Sum256([]byte(s2))
func main() {
fmt.Printf("s1: %s h1: %X h1 type: %T\n", s1, h1, h1)
fmt.Printf("s2: %s h2: %X h2 type: %T\n", s2, h2, h2)
fmt.Printf("Number of different bits: %d\n", 8 * DifferentBits(h1, h2))
}
func DifferentBits(c1 [32]uint8, c2 [32]uint8) int {
var counter int
for x := range c1 {
if c1[x] != c2[x] {
counter += 1
}
}
return counter
}
答案1
得分: 5
《Go编程语言》是Alan A. A. Donovan和Brian W. Kernighan合著的一本书。练习4.1要求编写一个函数,用于计算两个SHA256哈希值中不同的位数。
《C程序设计语言》是Brian W. Kernighan和Dennis M. Ritchie合著的一本书。练习2-9要求利用二进制补码系统中的观察,使用x &= (x-1)
来删除x
中最右边的1位。利用这个观察,编写一个更快的bitcount
版本。
在《位操作技巧》一书中,Sean Eron Anderson介绍了一种计算位集合的位数的方法,即Brian Kernighan的方法。代码示例中,使用一个循环来计算一个无符号整数v
中设置的位数。
对于练习4.1,你需要计算不同的位数,而不是字节。例如,给出的代码示例中,通过比较两个SHA256哈希值的每个字节的异或结果,然后计算不同位的数量。最后输出结果为139。
英文:
> The Go Programming Language
>
> Alan A. A. Donovan · Brian W.Kernighan
>
> Exercise 4.1: Write a function that counts the number of bits that
> are different in two SHA256 hashes.
> The C Programming Language
>
> Brian W.Kernighan · Dennis M. Ritchie
>
> Exercise 2-9. In a two's complement number system, x &= (x-1)
deletes
> the rightmost 1-bit in x
. Use this observation to write a faster
> version of bitcount
.
> Bit Twiddling Hacks
>
> Sean Eron Anderson
>
> Counting bits set, Brian Kernighan's way
>
> unsigned int v; // count the number of bits set in v
> unsigned int c; // c accumulates the total bits set in v
> for (c = 0; v; c++)
> {
> v &= v - 1; // clear the least significant bit set
> }
For exercise 4.1, you are counting the number of bytes that are different. Count the number of bits that are different. For example,
package main
import (
"crypto/sha256"
"fmt"
)
func BitsDifference(h1, h2 *[sha256.Size]byte) int {
n := 0
for i := range h1 {
for b := h1[i] ^ h2[i]; b != 0; b &= b - 1 {
n++
}
}
return n
}
func main() {
s1 := "unodostresquatro"
s2 := "UNODOSTRESQUATRO"
h1 := sha256.Sum256([]byte(s1))
h2 := sha256.Sum256([]byte(s2))
fmt.Println(BitsDifference(&h1, &h2))
}
Output:
139
答案2
得分: 1
这是我会做的方式
package main
import (
"crypto/sha256"
"fmt"
)
var (
s1 string = "unodostresquatro"
s2 string = "UNODOSTRESQUATRO"
h1 = sha256.Sum256([]byte(s1))
h2 = sha256.Sum256([]byte(s2))
)
func main() {
fmt.Printf("s1: %s h1: %X h1 type: %T\n", s1, h1, h1)
fmt.Printf("s2: %s h2: %X h2 type: %T\n", s2, h2, h2)
fmt.Printf("不同位的数量: %d\n", DifferentBits(h1, h2))
}
// bitCount 计算 x 中设置的位数
func bitCount(x uint8) int {
count := 0
for x != 0 {
x &= x - 1
count++
}
return count
}
func DifferentBits(c1 [32]uint8, c2 [32]uint8) int {
var counter int
for x := range c1 {
counter += bitCount(c1[x] ^ c2[x])
}
return counter
}
英文:
Here is how I would do it
package main
import (
"crypto/sha256"
"fmt"
)
var (
s1 string = "unodostresquatro"
s2 string = "UNODOSTRESQUATRO"
h1 = sha256.Sum256([]byte(s1))
h2 = sha256.Sum256([]byte(s2))
)
func main() {
fmt.Printf("s1: %s h1: %X h1 type: %T\n", s1, h1, h1)
fmt.Printf("s2: %s h2: %X h2 type: %T\n", s2, h2, h2)
fmt.Printf("Number of different bits: %d\n", DifferentBits(h1, h2))
}
// bitCount counts the number of bits set in x
func bitCount(x uint8) int {
count := 0
for x != 0 {
x &= x - 1
count++
}
return count
}
func DifferentBits(c1 [32]uint8, c2 [32]uint8) int {
var counter int
for x := range c1 {
counter += bitCount(c1[x] ^ c2[x])
}
return counter
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论