wudi il y a 6 mois
commit
23eb866c2b
4 fichiers modifiés avec 2464 ajouts et 0 suppressions
  1. 22 0
      dmp_message.proto
  2. 31 0
      dmp_message_pb2.py
  3. 54 0
      generate.py
  4. 2357 0
      toutiao/dmp/DmpDataProto.java

+ 22 - 0
dmp_message.proto

@@ -0,0 +1,22 @@
+syntax = "proto2";
+package toutiao.dmp;
+option java_outer_classname = "DmpDataProto";
+message DmpData { //上传文件每行一个base64编码的字符串,每个字符串包含一个完整的DmpData消息二进制字节串
+  repeated IdItem idList         = 1; // 每行数据包含的idList大小不能超过10000
+}
+message IdItem {
+    optional uint32 timestamp  = 1;  //若不设置,默认以上传文件的创建时间为此条记录的创建时间
+    required DataType dataType = 2;  //指定此id的类型,如IMEI、IDFA等
+    required string id         = 3;  //根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+    repeated string tags       = 4;  //标识此id的业务标签字符串
+    enum DataType {
+        IMEI               = 0; // 无加密 已经不可用
+        IDFA               = 1; // 无加密 已经不可用
+        UID                = 2; // 内部账号id  一般是内部数据使用
+        IMEI_MD5           = 4;
+        IDFA_MD5           = 5;
+        MOBILE_HASH_SHA256 = 6;
+        OAID               = 7;// 无加密 已经不可用
+        OAID_MD5           = 8;
+    }
+}

+ 31 - 0
dmp_message_pb2.py

@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: dmp_message.proto
+# Protobuf Python Version: 4.25.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11\x64mp_message.proto\x12\x0btoutiao.dmp\".\n\x07\x44mpData\x12#\n\x06idList\x18\x01 \x03(\x0b\x32\x13.toutiao.dmp.IdItem\"\xda\x01\n\x06IdItem\x12\x11\n\ttimestamp\x18\x01 \x01(\r\x12.\n\x08\x64\x61taType\x18\x02 \x02(\x0e\x32\x1c.toutiao.dmp.IdItem.DataType\x12\n\n\x02id\x18\x03 \x02(\t\x12\x0c\n\x04tags\x18\x04 \x03(\t\"s\n\x08\x44\x61taType\x12\x08\n\x04IMEI\x10\x00\x12\x08\n\x04IDFA\x10\x01\x12\x07\n\x03UID\x10\x02\x12\x0c\n\x08IMEI_MD5\x10\x04\x12\x0c\n\x08IDFA_MD5\x10\x05\x12\x16\n\x12MOBILE_HASH_SHA256\x10\x06\x12\x08\n\x04OAID\x10\x07\x12\x0c\n\x08OAID_MD5\x10\x08\x42\x0e\x42\x0c\x44mpDataProto')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'dmp_message_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+  _globals['DESCRIPTOR']._options = None
+  _globals['DESCRIPTOR']._serialized_options = b'B\014DmpDataProto'
+  _globals['_DMPDATA']._serialized_start=34
+  _globals['_DMPDATA']._serialized_end=80
+  _globals['_IDITEM']._serialized_start=83
+  _globals['_IDITEM']._serialized_end=301
+  _globals['_IDITEM_DATATYPE']._serialized_start=186
+  _globals['_IDITEM_DATATYPE']._serialized_end=301
+# @@protoc_insertion_point(module_scope)

+ 54 - 0
generate.py

@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+import base64
+import argparse
+import hashlib
+from zipfile import ZipFile
+import dmp_message_pb2  # 由pb文件生成的python代码, 使用Protocol Buffer2
+
+TYPES = {
+    'IMEI': dmp_message_pb2.IdItem.IMEI_MD5,
+    'OAID': dmp_message_pb2.IdItem.OAID_MD5,
+    'IDFA': dmp_message_pb2.IdItem.IDFA
+}
+
+def generate_valid_file(filename, type, md5):
+    dataType = TYPES[type]
+    target_filename = './' + type
+    target_file = open(target_filename, 'w')
+    count = 0
+    dmp_data = dmp_message_pb2.DmpData()
+    
+    with open(filename) as file:
+        for line in file:
+            count += 1
+            reset = count % 10000 == 0
+            if (reset):
+                binary_string = dmp_data.SerializeToString()
+                result_string = base64.b64encode(binary_string).decode()
+                target_file.write(result_string)
+                target_file.write('\n')
+                dmp_data = dmp_message_pb2.DmpData()
+            if (md5):
+                line = hashlib.md5(line.strip().encode('utf-8')).hexdigest()
+            item = dmp_data.idList.add()
+            item.dataType = dataType
+            item.id = line.lower().strip()
+    if count % 10000 > 0:
+        binary_string = dmp_data.SerializeToString()
+        result_string = base64.b64encode(binary_string).decode()
+        target_file.write(result_string)
+        target_file.write('\n')
+
+    target_file.close()
+    with ZipFile('./' + type + '.zip', 'w') as zip:
+        zip.write(target_filename)
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('filename')
+    parser.add_argument('-t', '--type', required=True)
+    parser.add_argument('-m', '--md5', action='store_true')
+    args = parser.parse_args()
+    # print(args)
+    generate_valid_file(args.filename, args.type, args.md5)

+ 2357 - 0
toutiao/dmp/DmpDataProto.java

@@ -0,0 +1,2357 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: dmp_message.proto
+
+// Protobuf Java Version: 3.25.1
+package toutiao.dmp;
+
+public final class DmpDataProto {
+  private DmpDataProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  public interface DmpDataOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:toutiao.dmp.DmpData)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    java.util.List<toutiao.dmp.DmpDataProto.IdItem> 
+        getIdListList();
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    toutiao.dmp.DmpDataProto.IdItem getIdList(int index);
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    int getIdListCount();
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    java.util.List<? extends toutiao.dmp.DmpDataProto.IdItemOrBuilder> 
+        getIdListOrBuilderList();
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    toutiao.dmp.DmpDataProto.IdItemOrBuilder getIdListOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   *上传文件每行一个base64编码的字符串,每个字符串包含一个完整的DmpData消息二进制字节串
+   * </pre>
+   *
+   * Protobuf type {@code toutiao.dmp.DmpData}
+   */
+  public static final class DmpData extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:toutiao.dmp.DmpData)
+      DmpDataOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use DmpData.newBuilder() to construct.
+    private DmpData(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private DmpData() {
+      idList_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new DmpData();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_DmpData_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_DmpData_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              toutiao.dmp.DmpDataProto.DmpData.class, toutiao.dmp.DmpDataProto.DmpData.Builder.class);
+    }
+
+    public static final int IDLIST_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private java.util.List<toutiao.dmp.DmpDataProto.IdItem> idList_;
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<toutiao.dmp.DmpDataProto.IdItem> getIdListList() {
+      return idList_;
+    }
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends toutiao.dmp.DmpDataProto.IdItemOrBuilder> 
+        getIdListOrBuilderList() {
+      return idList_;
+    }
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    @java.lang.Override
+    public int getIdListCount() {
+      return idList_.size();
+    }
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    @java.lang.Override
+    public toutiao.dmp.DmpDataProto.IdItem getIdList(int index) {
+      return idList_.get(index);
+    }
+    /**
+     * <pre>
+     * 每行数据包含的idList大小不能超过10000
+     * </pre>
+     *
+     * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+     */
+    @java.lang.Override
+    public toutiao.dmp.DmpDataProto.IdItemOrBuilder getIdListOrBuilder(
+        int index) {
+      return idList_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      for (int i = 0; i < getIdListCount(); i++) {
+        if (!getIdList(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < idList_.size(); i++) {
+        output.writeMessage(1, idList_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < idList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, idList_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof toutiao.dmp.DmpDataProto.DmpData)) {
+        return super.equals(obj);
+      }
+      toutiao.dmp.DmpDataProto.DmpData other = (toutiao.dmp.DmpDataProto.DmpData) obj;
+
+      if (!getIdListList()
+          .equals(other.getIdListList())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getIdListCount() > 0) {
+        hash = (37 * hash) + IDLIST_FIELD_NUMBER;
+        hash = (53 * hash) + getIdListList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static toutiao.dmp.DmpDataProto.DmpData parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static toutiao.dmp.DmpDataProto.DmpData parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static toutiao.dmp.DmpDataProto.DmpData parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(toutiao.dmp.DmpDataProto.DmpData prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     *上传文件每行一个base64编码的字符串,每个字符串包含一个完整的DmpData消息二进制字节串
+     * </pre>
+     *
+     * Protobuf type {@code toutiao.dmp.DmpData}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:toutiao.dmp.DmpData)
+        toutiao.dmp.DmpDataProto.DmpDataOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_DmpData_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_DmpData_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                toutiao.dmp.DmpDataProto.DmpData.class, toutiao.dmp.DmpDataProto.DmpData.Builder.class);
+      }
+
+      // Construct using toutiao.dmp.DmpDataProto.DmpData.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        if (idListBuilder_ == null) {
+          idList_ = java.util.Collections.emptyList();
+        } else {
+          idList_ = null;
+          idListBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_DmpData_descriptor;
+      }
+
+      @java.lang.Override
+      public toutiao.dmp.DmpDataProto.DmpData getDefaultInstanceForType() {
+        return toutiao.dmp.DmpDataProto.DmpData.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public toutiao.dmp.DmpDataProto.DmpData build() {
+        toutiao.dmp.DmpDataProto.DmpData result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public toutiao.dmp.DmpDataProto.DmpData buildPartial() {
+        toutiao.dmp.DmpDataProto.DmpData result = new toutiao.dmp.DmpDataProto.DmpData(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(toutiao.dmp.DmpDataProto.DmpData result) {
+        if (idListBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            idList_ = java.util.Collections.unmodifiableList(idList_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.idList_ = idList_;
+        } else {
+          result.idList_ = idListBuilder_.build();
+        }
+      }
+
+      private void buildPartial0(toutiao.dmp.DmpDataProto.DmpData result) {
+        int from_bitField0_ = bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof toutiao.dmp.DmpDataProto.DmpData) {
+          return mergeFrom((toutiao.dmp.DmpDataProto.DmpData)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(toutiao.dmp.DmpDataProto.DmpData other) {
+        if (other == toutiao.dmp.DmpDataProto.DmpData.getDefaultInstance()) return this;
+        if (idListBuilder_ == null) {
+          if (!other.idList_.isEmpty()) {
+            if (idList_.isEmpty()) {
+              idList_ = other.idList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureIdListIsMutable();
+              idList_.addAll(other.idList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.idList_.isEmpty()) {
+            if (idListBuilder_.isEmpty()) {
+              idListBuilder_.dispose();
+              idListBuilder_ = null;
+              idList_ = other.idList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              idListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getIdListFieldBuilder() : null;
+            } else {
+              idListBuilder_.addAllMessages(other.idList_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        for (int i = 0; i < getIdListCount(); i++) {
+          if (!getIdList(i).isInitialized()) {
+            return false;
+          }
+        }
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                toutiao.dmp.DmpDataProto.IdItem m =
+                    input.readMessage(
+                        toutiao.dmp.DmpDataProto.IdItem.PARSER,
+                        extensionRegistry);
+                if (idListBuilder_ == null) {
+                  ensureIdListIsMutable();
+                  idList_.add(m);
+                } else {
+                  idListBuilder_.addMessage(m);
+                }
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<toutiao.dmp.DmpDataProto.IdItem> idList_ =
+        java.util.Collections.emptyList();
+      private void ensureIdListIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          idList_ = new java.util.ArrayList<toutiao.dmp.DmpDataProto.IdItem>(idList_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          toutiao.dmp.DmpDataProto.IdItem, toutiao.dmp.DmpDataProto.IdItem.Builder, toutiao.dmp.DmpDataProto.IdItemOrBuilder> idListBuilder_;
+
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public java.util.List<toutiao.dmp.DmpDataProto.IdItem> getIdListList() {
+        if (idListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(idList_);
+        } else {
+          return idListBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public int getIdListCount() {
+        if (idListBuilder_ == null) {
+          return idList_.size();
+        } else {
+          return idListBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public toutiao.dmp.DmpDataProto.IdItem getIdList(int index) {
+        if (idListBuilder_ == null) {
+          return idList_.get(index);
+        } else {
+          return idListBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder setIdList(
+          int index, toutiao.dmp.DmpDataProto.IdItem value) {
+        if (idListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIdListIsMutable();
+          idList_.set(index, value);
+          onChanged();
+        } else {
+          idListBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder setIdList(
+          int index, toutiao.dmp.DmpDataProto.IdItem.Builder builderForValue) {
+        if (idListBuilder_ == null) {
+          ensureIdListIsMutable();
+          idList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          idListBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder addIdList(toutiao.dmp.DmpDataProto.IdItem value) {
+        if (idListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIdListIsMutable();
+          idList_.add(value);
+          onChanged();
+        } else {
+          idListBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder addIdList(
+          int index, toutiao.dmp.DmpDataProto.IdItem value) {
+        if (idListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIdListIsMutable();
+          idList_.add(index, value);
+          onChanged();
+        } else {
+          idListBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder addIdList(
+          toutiao.dmp.DmpDataProto.IdItem.Builder builderForValue) {
+        if (idListBuilder_ == null) {
+          ensureIdListIsMutable();
+          idList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          idListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder addIdList(
+          int index, toutiao.dmp.DmpDataProto.IdItem.Builder builderForValue) {
+        if (idListBuilder_ == null) {
+          ensureIdListIsMutable();
+          idList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          idListBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder addAllIdList(
+          java.lang.Iterable<? extends toutiao.dmp.DmpDataProto.IdItem> values) {
+        if (idListBuilder_ == null) {
+          ensureIdListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, idList_);
+          onChanged();
+        } else {
+          idListBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder clearIdList() {
+        if (idListBuilder_ == null) {
+          idList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          idListBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public Builder removeIdList(int index) {
+        if (idListBuilder_ == null) {
+          ensureIdListIsMutable();
+          idList_.remove(index);
+          onChanged();
+        } else {
+          idListBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public toutiao.dmp.DmpDataProto.IdItem.Builder getIdListBuilder(
+          int index) {
+        return getIdListFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public toutiao.dmp.DmpDataProto.IdItemOrBuilder getIdListOrBuilder(
+          int index) {
+        if (idListBuilder_ == null) {
+          return idList_.get(index);  } else {
+          return idListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public java.util.List<? extends toutiao.dmp.DmpDataProto.IdItemOrBuilder> 
+           getIdListOrBuilderList() {
+        if (idListBuilder_ != null) {
+          return idListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(idList_);
+        }
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public toutiao.dmp.DmpDataProto.IdItem.Builder addIdListBuilder() {
+        return getIdListFieldBuilder().addBuilder(
+            toutiao.dmp.DmpDataProto.IdItem.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public toutiao.dmp.DmpDataProto.IdItem.Builder addIdListBuilder(
+          int index) {
+        return getIdListFieldBuilder().addBuilder(
+            index, toutiao.dmp.DmpDataProto.IdItem.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * 每行数据包含的idList大小不能超过10000
+       * </pre>
+       *
+       * <code>repeated .toutiao.dmp.IdItem idList = 1;</code>
+       */
+      public java.util.List<toutiao.dmp.DmpDataProto.IdItem.Builder> 
+           getIdListBuilderList() {
+        return getIdListFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          toutiao.dmp.DmpDataProto.IdItem, toutiao.dmp.DmpDataProto.IdItem.Builder, toutiao.dmp.DmpDataProto.IdItemOrBuilder> 
+          getIdListFieldBuilder() {
+        if (idListBuilder_ == null) {
+          idListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              toutiao.dmp.DmpDataProto.IdItem, toutiao.dmp.DmpDataProto.IdItem.Builder, toutiao.dmp.DmpDataProto.IdItemOrBuilder>(
+                  idList_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          idList_ = null;
+        }
+        return idListBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:toutiao.dmp.DmpData)
+    }
+
+    // @@protoc_insertion_point(class_scope:toutiao.dmp.DmpData)
+    private static final toutiao.dmp.DmpDataProto.DmpData DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new toutiao.dmp.DmpDataProto.DmpData();
+    }
+
+    public static toutiao.dmp.DmpDataProto.DmpData getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    @java.lang.Deprecated public static final com.google.protobuf.Parser<DmpData>
+        PARSER = new com.google.protobuf.AbstractParser<DmpData>() {
+      @java.lang.Override
+      public DmpData parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<DmpData> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<DmpData> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public toutiao.dmp.DmpDataProto.DmpData getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface IdItemOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:toutiao.dmp.IdItem)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+     * </pre>
+     *
+     * <code>optional uint32 timestamp = 1;</code>
+     * @return Whether the timestamp field is set.
+     */
+    boolean hasTimestamp();
+    /**
+     * <pre>
+     *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+     * </pre>
+     *
+     * <code>optional uint32 timestamp = 1;</code>
+     * @return The timestamp.
+     */
+    int getTimestamp();
+
+    /**
+     * <pre>
+     *指定此id的类型,如IMEI、IDFA等
+     * </pre>
+     *
+     * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+     * @return Whether the dataType field is set.
+     */
+    boolean hasDataType();
+    /**
+     * <pre>
+     *指定此id的类型,如IMEI、IDFA等
+     * </pre>
+     *
+     * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+     * @return The dataType.
+     */
+    toutiao.dmp.DmpDataProto.IdItem.DataType getDataType();
+
+    /**
+     * <pre>
+     *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+     * </pre>
+     *
+     * <code>required string id = 3;</code>
+     * @return Whether the id field is set.
+     */
+    boolean hasId();
+    /**
+     * <pre>
+     *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+     * </pre>
+     *
+     * <code>required string id = 3;</code>
+     * @return The id.
+     */
+    java.lang.String getId();
+    /**
+     * <pre>
+     *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+     * </pre>
+     *
+     * <code>required string id = 3;</code>
+     * @return The bytes for id.
+     */
+    com.google.protobuf.ByteString
+        getIdBytes();
+
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @return A list containing the tags.
+     */
+    java.util.List<java.lang.String>
+        getTagsList();
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @return The count of tags.
+     */
+    int getTagsCount();
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @param index The index of the element to return.
+     * @return The tags at the given index.
+     */
+    java.lang.String getTags(int index);
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the tags at the given index.
+     */
+    com.google.protobuf.ByteString
+        getTagsBytes(int index);
+  }
+  /**
+   * Protobuf type {@code toutiao.dmp.IdItem}
+   */
+  public static final class IdItem extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:toutiao.dmp.IdItem)
+      IdItemOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use IdItem.newBuilder() to construct.
+    private IdItem(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private IdItem() {
+      dataType_ = 0;
+      id_ = "";
+      tags_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new IdItem();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_IdItem_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_IdItem_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              toutiao.dmp.DmpDataProto.IdItem.class, toutiao.dmp.DmpDataProto.IdItem.Builder.class);
+    }
+
+    /**
+     * Protobuf enum {@code toutiao.dmp.IdItem.DataType}
+     */
+    public enum DataType
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * <pre>
+       * 无加密 已经不可用
+       * </pre>
+       *
+       * <code>IMEI = 0;</code>
+       */
+      IMEI(0),
+      /**
+       * <pre>
+       * 无加密 已经不可用
+       * </pre>
+       *
+       * <code>IDFA = 1;</code>
+       */
+      IDFA(1),
+      /**
+       * <pre>
+       * 内部账号id  一般是内部数据使用
+       * </pre>
+       *
+       * <code>UID = 2;</code>
+       */
+      UID(2),
+      /**
+       * <code>IMEI_MD5 = 4;</code>
+       */
+      IMEI_MD5(4),
+      /**
+       * <code>IDFA_MD5 = 5;</code>
+       */
+      IDFA_MD5(5),
+      /**
+       * <code>MOBILE_HASH_SHA256 = 6;</code>
+       */
+      MOBILE_HASH_SHA256(6),
+      /**
+       * <pre>
+       * 无加密 已经不可用
+       * </pre>
+       *
+       * <code>OAID = 7;</code>
+       */
+      OAID(7),
+      /**
+       * <code>OAID_MD5 = 8;</code>
+       */
+      OAID_MD5(8),
+      ;
+
+      /**
+       * <pre>
+       * 无加密 已经不可用
+       * </pre>
+       *
+       * <code>IMEI = 0;</code>
+       */
+      public static final int IMEI_VALUE = 0;
+      /**
+       * <pre>
+       * 无加密 已经不可用
+       * </pre>
+       *
+       * <code>IDFA = 1;</code>
+       */
+      public static final int IDFA_VALUE = 1;
+      /**
+       * <pre>
+       * 内部账号id  一般是内部数据使用
+       * </pre>
+       *
+       * <code>UID = 2;</code>
+       */
+      public static final int UID_VALUE = 2;
+      /**
+       * <code>IMEI_MD5 = 4;</code>
+       */
+      public static final int IMEI_MD5_VALUE = 4;
+      /**
+       * <code>IDFA_MD5 = 5;</code>
+       */
+      public static final int IDFA_MD5_VALUE = 5;
+      /**
+       * <code>MOBILE_HASH_SHA256 = 6;</code>
+       */
+      public static final int MOBILE_HASH_SHA256_VALUE = 6;
+      /**
+       * <pre>
+       * 无加密 已经不可用
+       * </pre>
+       *
+       * <code>OAID = 7;</code>
+       */
+      public static final int OAID_VALUE = 7;
+      /**
+       * <code>OAID_MD5 = 8;</code>
+       */
+      public static final int OAID_MD5_VALUE = 8;
+
+
+      public final int getNumber() {
+        return value;
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static DataType valueOf(int value) {
+        return forNumber(value);
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       */
+      public static DataType forNumber(int value) {
+        switch (value) {
+          case 0: return IMEI;
+          case 1: return IDFA;
+          case 2: return UID;
+          case 4: return IMEI_MD5;
+          case 5: return IDFA_MD5;
+          case 6: return MOBILE_HASH_SHA256;
+          case 7: return OAID;
+          case 8: return OAID_MD5;
+          default: return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap<DataType>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static final com.google.protobuf.Internal.EnumLiteMap<
+          DataType> internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<DataType>() {
+              public DataType findValueByNumber(int number) {
+                return DataType.forNumber(number);
+              }
+            };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(ordinal());
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return toutiao.dmp.DmpDataProto.IdItem.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final DataType[] VALUES = values();
+
+      public static DataType valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int value;
+
+      private DataType(int value) {
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:toutiao.dmp.IdItem.DataType)
+    }
+
+    private int bitField0_;
+    public static final int TIMESTAMP_FIELD_NUMBER = 1;
+    private int timestamp_ = 0;
+    /**
+     * <pre>
+     *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+     * </pre>
+     *
+     * <code>optional uint32 timestamp = 1;</code>
+     * @return Whether the timestamp field is set.
+     */
+    @java.lang.Override
+    public boolean hasTimestamp() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     * <pre>
+     *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+     * </pre>
+     *
+     * <code>optional uint32 timestamp = 1;</code>
+     * @return The timestamp.
+     */
+    @java.lang.Override
+    public int getTimestamp() {
+      return timestamp_;
+    }
+
+    public static final int DATATYPE_FIELD_NUMBER = 2;
+    private int dataType_ = 0;
+    /**
+     * <pre>
+     *指定此id的类型,如IMEI、IDFA等
+     * </pre>
+     *
+     * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+     * @return Whether the dataType field is set.
+     */
+    @java.lang.Override public boolean hasDataType() {
+      return ((bitField0_ & 0x00000002) != 0);
+    }
+    /**
+     * <pre>
+     *指定此id的类型,如IMEI、IDFA等
+     * </pre>
+     *
+     * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+     * @return The dataType.
+     */
+    @java.lang.Override public toutiao.dmp.DmpDataProto.IdItem.DataType getDataType() {
+      toutiao.dmp.DmpDataProto.IdItem.DataType result = toutiao.dmp.DmpDataProto.IdItem.DataType.forNumber(dataType_);
+      return result == null ? toutiao.dmp.DmpDataProto.IdItem.DataType.IMEI : result;
+    }
+
+    public static final int ID_FIELD_NUMBER = 3;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object id_ = "";
+    /**
+     * <pre>
+     *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+     * </pre>
+     *
+     * <code>required string id = 3;</code>
+     * @return Whether the id field is set.
+     */
+    @java.lang.Override
+    public boolean hasId() {
+      return ((bitField0_ & 0x00000004) != 0);
+    }
+    /**
+     * <pre>
+     *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+     * </pre>
+     *
+     * <code>required string id = 3;</code>
+     * @return The id.
+     */
+    @java.lang.Override
+    public java.lang.String getId() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          id_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+     * </pre>
+     *
+     * <code>required string id = 3;</code>
+     * @return The bytes for id.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getIdBytes() {
+      java.lang.Object ref = id_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        id_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int TAGS_FIELD_NUMBER = 4;
+    @SuppressWarnings("serial")
+    private com.google.protobuf.LazyStringArrayList tags_ =
+        com.google.protobuf.LazyStringArrayList.emptyList();
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @return A list containing the tags.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getTagsList() {
+      return tags_;
+    }
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @return The count of tags.
+     */
+    public int getTagsCount() {
+      return tags_.size();
+    }
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @param index The index of the element to return.
+     * @return The tags at the given index.
+     */
+    public java.lang.String getTags(int index) {
+      return tags_.get(index);
+    }
+    /**
+     * <pre>
+     *标识此id的业务标签字符串
+     * </pre>
+     *
+     * <code>repeated string tags = 4;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the tags at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getTagsBytes(int index) {
+      return tags_.getByteString(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      if (!hasDataType()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasId()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (((bitField0_ & 0x00000001) != 0)) {
+        output.writeUInt32(1, timestamp_);
+      }
+      if (((bitField0_ & 0x00000002) != 0)) {
+        output.writeEnum(2, dataType_);
+      }
+      if (((bitField0_ & 0x00000004) != 0)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, id_);
+      }
+      for (int i = 0; i < tags_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, tags_.getRaw(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(1, timestamp_);
+      }
+      if (((bitField0_ & 0x00000002) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, dataType_);
+      }
+      if (((bitField0_ & 0x00000004) != 0)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, id_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < tags_.size(); i++) {
+          dataSize += computeStringSizeNoTag(tags_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getTagsList().size();
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof toutiao.dmp.DmpDataProto.IdItem)) {
+        return super.equals(obj);
+      }
+      toutiao.dmp.DmpDataProto.IdItem other = (toutiao.dmp.DmpDataProto.IdItem) obj;
+
+      if (hasTimestamp() != other.hasTimestamp()) return false;
+      if (hasTimestamp()) {
+        if (getTimestamp()
+            != other.getTimestamp()) return false;
+      }
+      if (hasDataType() != other.hasDataType()) return false;
+      if (hasDataType()) {
+        if (dataType_ != other.dataType_) return false;
+      }
+      if (hasId() != other.hasId()) return false;
+      if (hasId()) {
+        if (!getId()
+            .equals(other.getId())) return false;
+      }
+      if (!getTagsList()
+          .equals(other.getTagsList())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasTimestamp()) {
+        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
+        hash = (53 * hash) + getTimestamp();
+      }
+      if (hasDataType()) {
+        hash = (37 * hash) + DATATYPE_FIELD_NUMBER;
+        hash = (53 * hash) + dataType_;
+      }
+      if (hasId()) {
+        hash = (37 * hash) + ID_FIELD_NUMBER;
+        hash = (53 * hash) + getId().hashCode();
+      }
+      if (getTagsCount() > 0) {
+        hash = (37 * hash) + TAGS_FIELD_NUMBER;
+        hash = (53 * hash) + getTagsList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    public static toutiao.dmp.DmpDataProto.IdItem parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static toutiao.dmp.DmpDataProto.IdItem parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static toutiao.dmp.DmpDataProto.IdItem parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(toutiao.dmp.DmpDataProto.IdItem prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code toutiao.dmp.IdItem}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:toutiao.dmp.IdItem)
+        toutiao.dmp.DmpDataProto.IdItemOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_IdItem_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_IdItem_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                toutiao.dmp.DmpDataProto.IdItem.class, toutiao.dmp.DmpDataProto.IdItem.Builder.class);
+      }
+
+      // Construct using toutiao.dmp.DmpDataProto.IdItem.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        timestamp_ = 0;
+        dataType_ = 0;
+        id_ = "";
+        tags_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return toutiao.dmp.DmpDataProto.internal_static_toutiao_dmp_IdItem_descriptor;
+      }
+
+      @java.lang.Override
+      public toutiao.dmp.DmpDataProto.IdItem getDefaultInstanceForType() {
+        return toutiao.dmp.DmpDataProto.IdItem.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public toutiao.dmp.DmpDataProto.IdItem build() {
+        toutiao.dmp.DmpDataProto.IdItem result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public toutiao.dmp.DmpDataProto.IdItem buildPartial() {
+        toutiao.dmp.DmpDataProto.IdItem result = new toutiao.dmp.DmpDataProto.IdItem(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(toutiao.dmp.DmpDataProto.IdItem result) {
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.timestamp_ = timestamp_;
+          to_bitField0_ |= 0x00000001;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.dataType_ = dataType_;
+          to_bitField0_ |= 0x00000002;
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.id_ = id_;
+          to_bitField0_ |= 0x00000004;
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          tags_.makeImmutable();
+          result.tags_ = tags_;
+        }
+        result.bitField0_ |= to_bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof toutiao.dmp.DmpDataProto.IdItem) {
+          return mergeFrom((toutiao.dmp.DmpDataProto.IdItem)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(toutiao.dmp.DmpDataProto.IdItem other) {
+        if (other == toutiao.dmp.DmpDataProto.IdItem.getDefaultInstance()) return this;
+        if (other.hasTimestamp()) {
+          setTimestamp(other.getTimestamp());
+        }
+        if (other.hasDataType()) {
+          setDataType(other.getDataType());
+        }
+        if (other.hasId()) {
+          id_ = other.id_;
+          bitField0_ |= 0x00000004;
+          onChanged();
+        }
+        if (!other.tags_.isEmpty()) {
+          if (tags_.isEmpty()) {
+            tags_ = other.tags_;
+            bitField0_ |= 0x00000008;
+          } else {
+            ensureTagsIsMutable();
+            tags_.addAll(other.tags_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        if (!hasDataType()) {
+          return false;
+        }
+        if (!hasId()) {
+          return false;
+        }
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                timestamp_ = input.readUInt32();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 8
+              case 16: {
+                int tmpRaw = input.readEnum();
+                toutiao.dmp.DmpDataProto.IdItem.DataType tmpValue =
+                    toutiao.dmp.DmpDataProto.IdItem.DataType.forNumber(tmpRaw);
+                if (tmpValue == null) {
+                  mergeUnknownVarintField(2, tmpRaw);
+                } else {
+                  dataType_ = tmpRaw;
+                  bitField0_ |= 0x00000002;
+                }
+                break;
+              } // case 16
+              case 26: {
+                id_ = input.readBytes();
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 26
+              case 34: {
+                com.google.protobuf.ByteString bs = input.readBytes();
+                ensureTagsIsMutable();
+                tags_.add(bs);
+                break;
+              } // case 34
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private int timestamp_ ;
+      /**
+       * <pre>
+       *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+       * </pre>
+       *
+       * <code>optional uint32 timestamp = 1;</code>
+       * @return Whether the timestamp field is set.
+       */
+      @java.lang.Override
+      public boolean hasTimestamp() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <pre>
+       *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+       * </pre>
+       *
+       * <code>optional uint32 timestamp = 1;</code>
+       * @return The timestamp.
+       */
+      @java.lang.Override
+      public int getTimestamp() {
+        return timestamp_;
+      }
+      /**
+       * <pre>
+       *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+       * </pre>
+       *
+       * <code>optional uint32 timestamp = 1;</code>
+       * @param value The timestamp to set.
+       * @return This builder for chaining.
+       */
+      public Builder setTimestamp(int value) {
+
+        timestamp_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *若不设置,默认以上传文件的创建时间为此条记录的创建时间
+       * </pre>
+       *
+       * <code>optional uint32 timestamp = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearTimestamp() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        timestamp_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int dataType_ = 0;
+      /**
+       * <pre>
+       *指定此id的类型,如IMEI、IDFA等
+       * </pre>
+       *
+       * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+       * @return Whether the dataType field is set.
+       */
+      @java.lang.Override public boolean hasDataType() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       *指定此id的类型,如IMEI、IDFA等
+       * </pre>
+       *
+       * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+       * @return The dataType.
+       */
+      @java.lang.Override
+      public toutiao.dmp.DmpDataProto.IdItem.DataType getDataType() {
+        toutiao.dmp.DmpDataProto.IdItem.DataType result = toutiao.dmp.DmpDataProto.IdItem.DataType.forNumber(dataType_);
+        return result == null ? toutiao.dmp.DmpDataProto.IdItem.DataType.IMEI : result;
+      }
+      /**
+       * <pre>
+       *指定此id的类型,如IMEI、IDFA等
+       * </pre>
+       *
+       * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+       * @param value The dataType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDataType(toutiao.dmp.DmpDataProto.IdItem.DataType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000002;
+        dataType_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *指定此id的类型,如IMEI、IDFA等
+       * </pre>
+       *
+       * <code>required .toutiao.dmp.IdItem.DataType dataType = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearDataType() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        dataType_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object id_ = "";
+      /**
+       * <pre>
+       *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+       * </pre>
+       *
+       * <code>required string id = 3;</code>
+       * @return Whether the id field is set.
+       */
+      public boolean hasId() {
+        return ((bitField0_ & 0x00000004) != 0);
+      }
+      /**
+       * <pre>
+       *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+       * </pre>
+       *
+       * <code>required string id = 3;</code>
+       * @return The id.
+       */
+      public java.lang.String getId() {
+        java.lang.Object ref = id_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (bs.isValidUtf8()) {
+            id_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+       * </pre>
+       *
+       * <code>required string id = 3;</code>
+       * @return The bytes for id.
+       */
+      public com.google.protobuf.ByteString
+          getIdBytes() {
+        java.lang.Object ref = id_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          id_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+       * </pre>
+       *
+       * <code>required string id = 3;</code>
+       * @param value The id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setId(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        id_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+       * </pre>
+       *
+       * <code>required string id = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearId() {
+        id_ = getDefaultInstance().getId();
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *根据dataType字段的类型,放置对应类型的id的字符串,需要小写
+       * </pre>
+       *
+       * <code>required string id = 3;</code>
+       * @param value The bytes for id to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        id_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringArrayList tags_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      private void ensureTagsIsMutable() {
+        if (!tags_.isModifiable()) {
+          tags_ = new com.google.protobuf.LazyStringArrayList(tags_);
+        }
+        bitField0_ |= 0x00000008;
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @return A list containing the tags.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getTagsList() {
+        tags_.makeImmutable();
+        return tags_;
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @return The count of tags.
+       */
+      public int getTagsCount() {
+        return tags_.size();
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @param index The index of the element to return.
+       * @return The tags at the given index.
+       */
+      public java.lang.String getTags(int index) {
+        return tags_.get(index);
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the tags at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getTagsBytes(int index) {
+        return tags_.getByteString(index);
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @param index The index to set the value at.
+       * @param value The tags to set.
+       * @return This builder for chaining.
+       */
+      public Builder setTags(
+          int index, java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureTagsIsMutable();
+        tags_.set(index, value);
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @param value The tags to add.
+       * @return This builder for chaining.
+       */
+      public Builder addTags(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureTagsIsMutable();
+        tags_.add(value);
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @param values The tags to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllTags(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureTagsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, tags_);
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearTags() {
+        tags_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000008);;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *标识此id的业务标签字符串
+       * </pre>
+       *
+       * <code>repeated string tags = 4;</code>
+       * @param value The bytes of the tags to add.
+       * @return This builder for chaining.
+       */
+      public Builder addTagsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureTagsIsMutable();
+        tags_.add(value);
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:toutiao.dmp.IdItem)
+    }
+
+    // @@protoc_insertion_point(class_scope:toutiao.dmp.IdItem)
+    private static final toutiao.dmp.DmpDataProto.IdItem DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new toutiao.dmp.DmpDataProto.IdItem();
+    }
+
+    public static toutiao.dmp.DmpDataProto.IdItem getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    @java.lang.Deprecated public static final com.google.protobuf.Parser<IdItem>
+        PARSER = new com.google.protobuf.AbstractParser<IdItem>() {
+      @java.lang.Override
+      public IdItem parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<IdItem> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<IdItem> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public toutiao.dmp.DmpDataProto.IdItem getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_toutiao_dmp_DmpData_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_toutiao_dmp_DmpData_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_toutiao_dmp_IdItem_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_toutiao_dmp_IdItem_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\021dmp_message.proto\022\013toutiao.dmp\".\n\007DmpD" +
+      "ata\022#\n\006idList\030\001 \003(\0132\023.toutiao.dmp.IdItem" +
+      "\"\332\001\n\006IdItem\022\021\n\ttimestamp\030\001 \001(\r\022.\n\010dataTy" +
+      "pe\030\002 \002(\0162\034.toutiao.dmp.IdItem.DataType\022\n" +
+      "\n\002id\030\003 \002(\t\022\014\n\004tags\030\004 \003(\t\"s\n\010DataType\022\010\n\004" +
+      "IMEI\020\000\022\010\n\004IDFA\020\001\022\007\n\003UID\020\002\022\014\n\010IMEI_MD5\020\004\022" +
+      "\014\n\010IDFA_MD5\020\005\022\026\n\022MOBILE_HASH_SHA256\020\006\022\010\n" +
+      "\004OAID\020\007\022\014\n\010OAID_MD5\020\010B\016B\014DmpDataProto"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        });
+    internal_static_toutiao_dmp_DmpData_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_toutiao_dmp_DmpData_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_toutiao_dmp_DmpData_descriptor,
+        new java.lang.String[] { "IdList", });
+    internal_static_toutiao_dmp_IdItem_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_toutiao_dmp_IdItem_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_toutiao_dmp_IdItem_descriptor,
+        new java.lang.String[] { "Timestamp", "DataType", "Id", "Tags", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}