func main() { var args struct { M uint `help:"num bits"` K uint `help:"num hashing functions"` } tagflag.Parse(&args, tagflag.Description("adds lines from stdin to a bloom filter with the given configuration, and gives collision stats at EOF")) filter := bloom.New(args.M, args.K) scanner := bufio.NewScanner(os.Stdin) n := 0 collisions := 0 for scanner.Scan() { if filter.TestAndAdd(scanner.Bytes()) { collisions++ } n++ } if err := scanner.Err(); err != nil { fmt.Fprintf(os.Stderr, "error reading stdin: %s", err) os.Exit(1) } fmt.Printf("collisions %d/%d (%f)\n", collisions, n, float64(collisions)/float64(n)*100) }
func main() { log.SetFlags(log.Flags() | log.Lshortfile) var args struct { AnnounceList []string `name:"a" help:"extra announce-list tier entry"` tagflag.StartPos Root string } tagflag.Parse(&args, tagflag.Description("Creates a torrent metainfo for the file system rooted at ROOT, and outputs it to stdout.")) mi := metainfo.MetaInfo{ AnnounceList: builtinAnnounceList, } for _, a := range args.AnnounceList { mi.AnnounceList = append(mi.AnnounceList, []string{a}) } mi.SetDefaults() err := mi.Info.BuildFromFilePath(args.Root) if err != nil { log.Fatal(err) } err = mi.Write(os.Stdout) if err != nil { log.Fatal(err) } }