blob: 09719a45a0e8d76e76cb5e329451865e5a261dbe [file] [log] [blame]
/*
* Copyright 2017 HugeGraph Authors
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.baidu.hugegraph.formatter.kgdumper;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.List;
public class SignFS64 {
static List<Integer> _MOD_PRIME_LIST_1 = Arrays.asList(256, 65536, 3, 768, 196608, 9, 2304, 589824,
27, 6912, 1769472, 81, 20736, 5308416, 243, 62208, 15925248, 729, 186624, 14221318, 2187, 559872, 9109528,
6561, 1679616, 10551371, 19683, 5038848, 14876900, 59049, 15116544, 11076274, 177147, 11795206, 16451609,
531441, 1831192, 15800401, 1594323, 5493576, 13846777, 4782969, 16480728, 7985905, 14348907, 15887758,
7180502, 9492295, 14108848, 4764293, 11699672, 8772118, 14292879, 1544590, 9539141, 9324211, 4633770,
11840210, 11195420, 13901310, 1966204, 31834, 8149504, 5898612, 95502, 7671299, 918623, 286506, 6236684,
2755869, 859518, 1932839, 8267607, 2578554, 5798517, 8025608, 7735662, 618338, 7299611, 6429773, 1855014,
5121620, 2512106, 5565042, 15364860, 7536318, 16695126, 12540154, 5831741, 16530952, 4066036, 718010,
16038430, 12198108, 2154030, 14560864, 3039898, 6462090, 10128166, 9119694, 2609057, 13607285, 10581869,
7827171, 7267429, 14968394, 6704300, 5025074, 11350756, 3335687, 15075222, 497842, 10007061, 11671240,
1493526, 13243970, 1459294, 4480578, 6177484, 4377882, 13441734, 1755239, 13133646, 6770776, 5265717,
5846512, 3535115, 15797151, 762323, 10605345, 13837027, 2286969, 15038822, 7956655, 6860907, 11562040,
7092752, 3805508, 1131694, 4501043, 11416524, 3395082, 13503129, 695146, 10185246, 6954961, 2085438,
13778525, 4087670, 6256314, 7781149, 12263010, 1991729, 6566234, 3234604, 5975187, 2921489, 9703812,
1148348, 8764467, 12334223, 3445044, 9516188, 3448243, 10335132, 11771351, 10344729, 14228183, 1759627,
14256974, 9130123, 5278881, 9216496, 10613156, 15836643, 10872275, 15062255, 13955503, 15839612, 11632339,
8312083, 13964410, 1342591, 8159036, 8338804, 4027773, 7699895, 8239199, 12083319, 6322472, 7940384,
2695531, 2190203, 7043939, 8086593, 6570609, 4354604, 7482566, 2934614, 13063812, 5670485, 8803842, 5637010,
234242, 9634313, 133817, 702726, 12125726, 401451, 2108178, 2822752, 1204353, 6324534, 8468256, 3613059,
2196389, 8627555, 10839177, 6589167, 9105452, 15740318, 2990288, 10539143, 13666528, 8970864, 14840216,
7445158, 10135379, 10966222, 5558261, 13628924, 16121453, 16674783, 7332346, 14809933, 16469923, 5219825,
10875373, 15855343, 15659475, 15848906, 14011603, 13423999, 13992292, 8480383, 6717571, 8422450, 8663936,
3375500, 8490137, 9214595, 10126500, 8693198, 10866572, 13602287, 9302381);
static List<Integer> _MOD_PRIME_LIST_2 = Arrays.asList(15824477, 7761153, 7145686, 580925, 14499208,
4036269, 9875725, 11605750, 1507777, 115335, 12748561, 8855010, 1960695, 15399149, 16317578, 16554616,
10127548, 8963642, 12993288, 4396326, 1387123, 2782309, 7628746, 6803892, 13744855, 12248289, 15002970,
15558948, 6894525, 3392505, 12844131, 16543731, 7340988, 246640, 12808243, 7356403, 4192880, 16413743,
7618458, 4170164, 10598447, 12073393, 3783992, 12401609, 3921293, 13996267, 9500965, 16330384, 3055753,
10521614, 9181344, 1616204, 11095448, 5088057, 10698269, 4073427, 2610974, 14098583, 2139463, 10832160,
4795125, 2816473, 16374730, 14408329, 14325643, 9935226, 10060807, 8655145, 1126852, 3261729, 12919873,
2379285, 5117796, 1534254, 6893447, 3116537, 9305119, 16525405, 2649532, 7192232, 12496701, 11487646,
4827551, 11117529, 10740793, 14959571, 4448804, 14821491, 2654722, 8520872, 307362, 11575876, 10637232,
5225154, 12240703, 13060954, 4941623, 6765563, 3932631, 121596, 14351377, 16523130, 2067132, 9092623,
12458026, 1586846, 3579800, 10460054, 10199183, 10525003, 10048928, 5614121, 11153061, 3059786, 11554062,
5052848, 1684765, 11869865, 2012421, 11863806, 461317, 656759, 358314, 7842389, 11164903, 6091338, 15880220,
5254162, 2889552, 1528556, 5434759, 15567986, 9208253, 8504908, 12997777, 5545510, 10365844, 2858622,
10387675, 8447358, 15042176, 8818485, 9387494, 4059007, 15696653, 8592607, 1894323, 15185116, 11856727,
15426292, 6488987, 237971, 10588979, 9649585, 4045507, 12240653, 13048154, 1664823, 6764713, 3715031,
11524792, 14336927, 12823930, 11372275, 8846973, 16680422, 8779486, 16180949, 15131990, 15033670, 6640949,
5585845, 3914405, 12232939, 11073370, 16213288, 6633575, 3698101, 7190712, 12107581, 12536120, 4801711,
4502489, 11787652, 14520291, 9433517, 15840895, 11964161, 9374998, 860031, 2064349, 8380175, 14620527,
1539535, 8245383, 13668173, 9394896, 5953919, 14255354, 8718441, 553429, 7460232, 13995905, 9408293,
9383551, 3049599, 8946190, 8525576, 1511586, 1090439, 10717200, 8919763, 1760264, 14420410, 641180,
13147289, 10266184, 10900060, 5400326, 6753138, 751831, 7919547, 14140152, 12781127, 414707, 5501798,
15952771, 7050019, 9644571, 2761923, 2409930, 12962916, 13398293, 7414412, 2265985, 9667394, 8604611,
4967347, 13350907, 12060795, 558904, 8861832, 3707127, 9501368, 16433552, 12689562, 10528465, 10935200,
14396166, 11211915, 1349211, 9854036, 6053366, 6159388, 16523821, 2244028);
private static long getsigns_24(String text,
String encode,
List<Integer> primes)
throws UnsupportedEncodingException {
long sign = 0;
byte[] textBytes = text.getBytes(encode);
int textLen = textBytes.length;
for (int i = 0; i < textLen; i++) {
int c = textBytes[i];
c = c >= 0 ? c : 256 + c;
sign += c * primes.get(i & 0xFF);
}
return sign & 0xFFFFFFFFL;
}
private static long getsigns_24_1(String text, String encode)
throws UnsupportedEncodingException {
return getsigns_24(text, encode, _MOD_PRIME_LIST_1);
}
private static long getsigns_24_2(String text, String encode)
throws UnsupportedEncodingException {
return getsigns_24(text, encode, _MOD_PRIME_LIST_2);
}
private static String longBytes2String(ByteBuffer buffer) {
BigInteger bi = new BigInteger("0");
for (int i = 0; i < buffer.capacity(); i++) {
BigInteger tmpBI = new BigInteger("1");
tmpBI = tmpBI.shiftLeft((8 - i - 1) * 8);
int byteValue = buffer.get(i);
byteValue = byteValue >= 0 ? byteValue : 256 + byteValue;
tmpBI = tmpBI.multiply(BigInteger.valueOf(byteValue));
bi = bi.add(tmpBI);
}
return bi.toString();
}
public static String createSignFs64(String text, String encode)
throws UnsupportedEncodingException {
int byteLen = text.getBytes(encode).length;
if (byteLen <= 4) {
ByteBuffer buffer = ByteBuffer.allocate(8);
for (int i = 0; i < 4 - byteLen; i++) {
buffer.put("\0".getBytes());
}
for (int i = byteLen - 1; i >= 0; i--) {
buffer.put(text.getBytes(encode)[i]);
}
buffer.put("\0\0\0\0".getBytes());
return longBytes2String(buffer);
} else if (byteLen <= 8) {
ByteBuffer buffer = ByteBuffer.allocate(8);
for (int i = 3; i >= 0; i--) {
buffer.put(text.getBytes(encode)[i]);
}
for (int i = 0; i < 8 - byteLen; i++) {
buffer.put("\0".getBytes());
}
for (int i = byteLen - 1; i >= 4; i--) {
buffer.put(text.getBytes(encode)[i]);
}
return longBytes2String(buffer);
} else {
long left = getsigns_24_1(text, encode);
long right = getsigns_24_2(text, encode);
BigInteger tbi = BigInteger.valueOf(left);
tbi = tbi.shiftLeft(32);
tbi = tbi.add(BigInteger.valueOf(right));
return tbi.toString();
}
}
}