我正在為 Flutter 實作一個openpeeps.com庫,用戶可以在其中創建自己的 peeps 以用作我們產品中的化身。
使用窺視作為頭像的原因之一是(理論上)它可以很容易地作為單個值存盤在資料庫中。
Peep我的庫中的A最多包含 6 個PeepAtoms:
class Peep {
final PeepAtom head;
final PeepAtom face;
final PeepAtom facialHair;
final PeepAtom? accessories;
final PeepAtom? body;
final PeepAtom? pose;
}
APeepAtom當前只是一個名稱,用于標識構建 a 所需的基礎影像檔案Peep:
class PeepAtom {
final String name;
}
如何獲得哈希?
我現在想做的是從Peep(int或string) 中獲取一個值,我可以將其存盤在資料庫中。如果我檢索資料,我想將值解構為唯一原子,以便我可以渲染適當的原子影像以顯示窺視。雖然我并不是真的希望優化存盤大小,但如果位元組大小很小,那就太好了。
因為我通常不使用這些東西,所以我不知道什么是最好的選擇。這些是我的(天真的)想法:
- 執行 a
Peep.toJson并將輸出轉換為base64. 由于一堆不必要的字符,可能效率低下。 - 為 a
PeepAtom.hashCode中的每個欄位執行 aPeep并上傳。作為一個 64 位 = 8 位元組 * 6(原子)的陣列。那很好,但不是一個單一的價值。 - 因為每個類別中只有有限數量的原子(少于 100 個),我可以使用位移并將
^其放入一個整數中。但是,我認為這不會真正起作用,因為我需要一個唯一識別符號,并且因為我在代碼中生成PeepAtoms 的代碼可能會非常復雜。
有更好的想法/演算法嗎?
uj5u.com熱心網友回復:
我不確定您所說的“相當復雜”是什么意思。將你的原子打包成一個 double 看起來很簡單。
請注意,這絕不是“哈希”。哈希是有損操作。我想你想恢復原始資料。
根據您的描述,每個原子需要七個位。它們的范圍可以是 0..98(因為您說“小于 100”)。雙精度數有 52 位尾數。你的六個原子需要 42 位,所以很容易適應。對于可能的原子null,只需給它一個特殊的未使用的 7 位值,例如 127。
現在只需使用乘法和加法來組合它們。使用模數和除法將它們拉回來。例如:
double val = head;
val = val * 128 face;
val = val * 128 facialHair;
...
提取:
int pose = val % 128;
val = (val / 128).floorToDouble();
int body = val % 128;
val = (val / 128).floorToDouble();
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488644.html
