我正在尝试将以位图格式生成的布卢姆过滤器序列化为一个base64字符串,这样我就可以将它保存在MongoDB中。但是portableSerialize函数对我来说有点棘手。
到目前为止,我只是在测试它是如何工作的,我生成了一个随机的筛选器值,稍后我尝试将这些值转换为将->缓冲区转换为数据->到base64:
func generateBloomFilterData(){
let bitmap = RoaringBitmap()
for i in 0..<50 {
let random = arc4random_uniform(2)
if random == 0 {
bitmap.add(UInt32(i))
}
}
let count = (Int(bitmap.count) * MemoryLayout<Int8>.size)
var buffer = [Int8](repeating: 0, count: count)
_ = bitmap.portableSerialize(buffer: &buffer)
let uintBuffer = buffer.map { UInt8(bitPattern: $0) }
let bufferData = Data(uintBuffer)
let base64String = bufferData()
print("buffer size: \(buffer.count), \(uintBuffer.count), base64: \(bufferData.base64EncodedString())")
//-> send base64 string to database
}这会产生一个错误:
malloc: MallocStackLogging:尝试释放超出界限的索引
控制台显示:
缓冲区大小: 20,20,base64: OjAAAAEAAAAAABMAEAAAAAMABQA=
有没有一种方法可以简单地从上面生成的RoaringBitmap(https://github.com/RoaringBitmap)中生成base64字符串?
发布于 2021-04-20 13:36:59
根据丹尼尔的帮助论GitHub,似乎我使用了错误的参数的大小。正确的语法如下:
let size = rbm.portableSizeInBytes()
var buffer = [Int8](repeating: 0, count: size)
_ = rbm.portableSerialize(buffer: &buffer)
let uint8Buffer = buffer.map { UInt8(bitPattern: $0) }
let base64Encoded = Data(uint8Buffer).base64EncodedString()https://stackoverflow.com/questions/67178930
复制相似问题