001package net.gdface.sdk;
002
003import java.util.Arrays;
004import java.util.Comparator;
005
006import net.gdface.utils.BufferUtils;
007import net.gdface.utils.BinaryUtils;
008
009/**
010 * FSE搜索结果对象<br>
011 * 该类实现了{@link Comparable}接口,可以根据相似度结果字段({@link FseResult#similarity})排序
012 * @author guyadong
013 *
014 */
015public  class FseResult implements Comparable<FseResult>{       
016        /**
017         * 特征码ID,
018         * 特征码的MD5校验值(使用MD5保证特征码ID的唯一性)
019         */
020        private byte[] featureId=null;
021        /**
022         * 用于识别特征拥有者的Id
023         * 由应用应用层解释
024         */
025        private String owner=null;
026        /**
027         * 相似度比较结果,代表当前特征码与输入搜索人脸特征的相似度比较值。
028         */
029        private double similarity=0;
030        
031        public FseResult() {
032        }
033        public FseResult(byte[] featureId, String owner, double similarity) {
034                this.featureId = featureId;
035                this.owner = owner;
036                this.similarity = similarity;
037        }
038        
039        @Override
040        public int compareTo(FseResult o) {
041                double sub = similarity - o.similarity;
042                return sub > 0 ? 1 : (sub < 0 ? -1 : 0);
043        }
044
045        /**
046         * 将{@link #owner}转为应用id(Long),如果{@link #owner}为{@code null}则返回{@code null}
047         * @return
048         */
049        public Long appLongId(){
050                return asAppID(owner);
051        }
052        /**
053         * 将{@link #owner}转为应用id(Integer),如果{@link #owner}为{@code null}则返回{@code null}
054         * @return
055         */
056        public Integer appIntId(){
057                Long l = asAppID(owner);
058                return l == null ? null : l.intValue();
059        }
060        /**
061         * 用于相似度排序的{@link Comparator}实例
062         */
063        public static final Comparator<FseResult> COMPARATOR = new Comparator<FseResult>() {
064                @Override
065                public int compare(FseResult o1, FseResult o2) {
066                        return o1.compareTo(o2);
067                }
068        };
069        /**
070         * 从{@link #owner}字段返回Long类型整数,
071         * @param owner HEX格式(32字节长)的MD5
072         * @return owner为{@code null}则返回{@code null}
073         */
074        public static Long asAppID(String owner){
075                if(owner != null && owner.getBytes().length == 32){                     
076                        return BufferUtils.asLongArray(BinaryUtils.hex2Bytes(owner))[1];
077                }
078                return null;
079        }
080        public byte[] getFeatureId() {
081                return featureId;
082        }
083        public void setFeatureId(byte[] featureId) {
084                this.featureId = featureId;
085        }
086
087        public String getOwner() {
088                return owner;
089        }
090        public void setOwner(String owner) {
091                this.owner = owner;
092        }
093        public double getSimilarity() {
094                return similarity;
095        }
096        public void setSimilarity(double similarity) {
097                this.similarity = similarity;
098        }
099        @Override
100        public int hashCode() {
101                final int prime = 31;
102                int result = 1;
103                result = prime * result + Arrays.hashCode(featureId);
104                result = prime * result + ((owner == null) ? 0 : owner.hashCode());
105                return result;
106        }
107        @Override
108        public boolean equals(Object obj) {
109                if (this == obj)
110                        return true;
111                if (obj == null)
112                        return false;
113                if (!(obj instanceof FseResult))
114                        return false;
115                FseResult other = (FseResult) obj;
116                if (!Arrays.equals(featureId, other.featureId))
117                        return false;
118                if (owner == null) {
119                        if (other.owner != null)
120                                return false;
121                } else if (!owner.equals(other.owner))
122                        return false;
123                return true;
124        }
125        @Override
126        public String toString() {
127                String out=String.format("featureId=[%s],imgMD5=[%s],similarity=%f", BinaryUtils.toHex(featureId),owner,similarity);            
128                return out;
129        }
130}