首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gocql无法将blob解编组成*[20]uint8

gocql无法将blob解编组成*[20]uint8
EN

Stack Overflow用户
提问于 2018-03-23 06:42:11
回答 1查看 876关注 0票数 1

我有一个关于使用blob类型作为分区键的问题。我使用它,因为我需要保存散列值。(哈希值返回二进制数据。通常为十六进制。)

我使用gocql尝试了一个select查询,但是由于以下错误,它失败了。对于这种查询,有什么方法可以获得成功的结果吗?

您的建议非常感谢!!

-结果hash_value: 208 61 222 22 16 214 223 135 169 6 25 44 237 166 229 50 5 40 221 / hash_value:?=??߇?A,??2( hash_value: 0xd03dde1610d6df87a90619412 ceda6e5320528dd字符串2018/03/22 10:03:17不能将blob分解为*20 into 8)

-- select.go

代码语言:javascript
复制
package main


import (
  "fmt"
  "log"
  "crypto/sha1"
  "reflect"
  "github.com/gocql/gocql"
)


func main() {
  cluster := gocql.NewCluster("10.0.0.1")
  cluster.Keyspace = "ks"
  cluster.Consistency = gocql.Quorum
  cluster.ProtoVersion = 4
  cluster.Authenticator = gocql.PasswordAuthenticator{
    Username: "cassandra",
    Password: "cassandra",
  }


  session, _ := cluster.CreateSession()
  defer session.Close()


  text := "text before hashed"
  data := []byte(text)
  hash_value := sha1.Sum(data)
  hexa_string := fmt.Sprintf("0x%x", hash_value)


  fmt.Println("hash_value: ", hash_value)
  fmt.Println(" / string: ", string(hash_value[:]))
  fmt.Println(" / column1: ", hexa_string)
  fmt.Println(reflect.TypeOf(hexa_string))


  // *** select  ***
  var column1 int
  returned_hash := sha1.Sum(data)


  //if err := session.Query(`SELECT hash_value, column1 FROM sample WHERE hash_value= ? LIMIT 1`,
  //  hexa_string).Consistency(gocql.One).Scan(&returned_hash, &column1); err != nil {
  if err := session.Query(`SELECT hash_value, column1 FROM sample WHERE hash_value=0xd03dde1610d6df87a90619412ceda6e5320528dd`).Consistency(gocql.One).Scan(&returned_hash, &column1); err != nil {
      //fmt.Println(err)
      log.Fatal(err)
  }
  fmt.Println("comment: ", returned_hash, user_id)


}

-表格定义

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS ks.samle (
  hash_value blob,
  column1 int,
  ...
  PRIMARY KEY((hash_value), column1)
) WITH CLUSTERING ORDER BY (column1 DESC);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-23 07:03:29

我通过更改变量的类型: returned_hash来解决这个问题。

  • returned_hash (var用于存储返回的结果)应该是[]字节。

我的理解如下。

  • marshal:将代码中提供的数据转换为cassandra可以处理的类型。
  • 解组:将cassandra返回的数据转换为golang代码可以处理的类型。
  • 最初的错误意味着后一种模式不太好。因此,returned_hash的类型肯定是错误的。

如果我错了就纠正我。谢谢。

代码语言:javascript
复制
package main

import (
  "fmt"
  "log"
  "crypto/sha1"
  "reflect"
  "github.com/gocql/gocql"
)

func main() {
  cluster := gocql.NewCluster("127.0.0.1")
  cluster.Keyspace = "browser"
  cluster.Consistency = gocql.Quorum
  //cluster.ProtoVersion = 4
  //cluster.Authenticator = gocql.PasswordAuthenticator{
  //  Username: "cassandra",
  //  Password: "cassandra",
  //}

  session, _ := cluster.CreateSession()
  defer session.Close()

  text := "text before hashed"
  data := []byte(text)
  hash_value := sha1.Sum(data)
  hexa_string := fmt.Sprintf("0x%x", hash_value)

  fmt.Println("hash_value: ", hash_value)
  fmt.Println(" / string(hash_value): ", string(hash_value[:]))
  fmt.Println(" / hexa(hash_value): ", hexa_string)
  fmt.Println(reflect.TypeOf(hexa_string))

  // *** select  ***
  var column1 int
  //returned_hash := sha1.Sum(data)
  //var returned_hash *[20]uint8
  var returned_hash []byte

  if err := session.Query(`SELECT hash_value, column1 FROM sample WHERE hash_value=? LIMIT 1`,
  hash_value[:]).Consistency(gocql.One).Scan(&returned_hash, &column1); err != nil {
  //if err := session.Query(`SELECT hash_value, column1 FROM sample WHERE hash_value=0xd03dde1610d6df87a90619412ceda6e5320528dd`).Consistency(gocql.One).Scan(&returned_hash, &column1); err != nil {
      log.Fatal(err)
  }
  fmt.Printf("Returned: %#x %d \n", returned_hash, column1)

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49443823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档